[英]Why do I get a connection error / timeout when using python suds to connect to Microsoft CRM?
When I try to connect to an MS CRM web service using suds/python-ntlm, I am getting a timeout on requests. 当我尝试使用suds / python-ntlm连接到MS CRM Web服务时,我的请求超时。 However, the code that I'm trying to replace -- which calls out to the cURL command line app to do the same call -- succeeds.
但是,我正在尝试替换的代码 - 它调用cURL命令行应用程序来执行相同的调用 - 成功。
Clearly something is different in the way that cURL is sending the command data, but I'll be damned if I know what the difference is. 显然,cURL发送命令数据的方式有所不同,但如果我知道差异是什么,我会被诅咒。 Below are the full details of the various calls.
以下是各种电话的详细信息。 Anyone got any tips?
有人有任何提示吗?
Here's the code that is making the request, followed by the output. 这是发出请求的代码,后跟输出。 The cURL command code is below that, and its response follows.
cURL命令代码低于该命令代码,其响应如下。 Hosts, users, and passwords have been changed to protect the innocent, of course.
当然,主机,用户和密码已经改变以保护无辜者。
wsdl_url = 'https://client.service.host/MSCrmServices/2007/MetadataService.asmx?WSDL'
username = r'domain\user.name'
password = 'userpass'
from suds.transport.https import WindowsHttpAuthenticated
from suds.client import Client
import logging
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG)
ntlmTransport = WindowsHttpAuthenticated(username=username, password=password)
metadata_client = Client(wsdl_url, transport=ntlmTransport)
request = metadata_client.factory.create('RetrieveAttributeRequest')
request.MetadataId = '00000000-0000-0000-0000-000000000000'
request.EntityLogicalName = 'opportunity'
request.LogicalName = 'new_typeofcontact'
request.RetrieveAsIfPublished = 'false'
attr = metadata_client.service.Execute(request)
print attr
Here's the output: 这是输出:
DEBUG:suds.client:sending to (http://client.service.host/MSCrmServices/2007/MetadataService.asmx)
message:
<SOAP-ENV:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://schemas.microsoft.com/crm/2007/WebServices" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<ns0:Body>
<ns1:Execute>
<ns1:Request xsi:type="ns1:RetrieveAttributeRequest">
<ns1:MetadataId>00000000-0000-0000-0000-000000000000</ns1:MetadataId>
<ns1:EntityLogicalName>opportunity</ns1:EntityLogicalName>
<ns1:LogicalName>new_typeofcontact</ns1:LogicalName>
<ns1:RetrieveAsIfPublished>false</ns1:RetrieveAsIfPublished>
</ns1:Request>
</ns1:Execute>
</ns0:Body>
</SOAP-ENV:Envelope>
DEBUG:suds.client:headers = {'SOAPAction': u'"http://schemas.microsoft.com/crm/2007/WebServices/Execute"', 'Content-Type': 'text/xml'}
DEBUG:suds.transport.http:sending:
URL:http://client.service.host/MSCrmServices/2007/MetadataService.asmx
HEADERS: {'SOAPAction': u'"http://schemas.microsoft.com/crm/2007/WebServices/Execute"', 'Content-Type': 'text/xml', 'Content-type': 'text/xml', 'Soapaction': u'"http://schemas.microsoft.com/crm/2007/WebServices/Execute"'}
MESSAGE:
<SOAP-ENV:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://schemas.microsoft.com/crm/2007/WebServices" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<ns0:Body>
<ns1:Execute>
<ns1:Request xsi:type="ns1:RetrieveAttributeRequest">
<ns1:MetadataId>00000000-0000-0000-0000-000000000000</ns1:MetadataId>
<ns1:EntityLogicalName>opportunity</ns1:EntityLogicalName>
<ns1:LogicalName>new_typeofcontact</ns1:LogicalName>
<ns1:RetrieveAsIfPublished>false</ns1:RetrieveAsIfPublished>
</ns1:Request>
</ns1:Execute>
</ns0:Body>
</SOAP-ENV:Envelope>
ERROR: An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line statement', (16, 0))
---------------------------------------------------------------------------
URLError Traceback (most recent call last)
/Users/crose/projects/2366/crm/<ipython console> in <module>()
/var/folders/nb/nbJAzxR1HbOppPcs6xO+dE+++TY/-Tmp-/python-67186icm.py in <module>()
19 request.LogicalName = 'new_typeofcontact'
20 request.RetrieveAsIfPublished = 'false'
21
---> 22 attr = metadata_client.service.Execute(request)
23 print attr
/Users/crose/virtualenv/advanis/lib/python2.6/site-packages/suds/client.pyc in __call__(self, *args, **kwargs)
537 return (500, e)
538 else:
--> 539 return client.invoke(args, kwargs)
540
541 def faults(self):
/Users/crose/virtualenv/advanis/lib/python2.6/site-packages/suds/client.pyc in invoke(self, args, kwargs)
596 self.method.name, timer)
597 timer.start()
--> 598 result = self.send(msg)
599 timer.stop()
600 metrics.log.debug(
/Users/crose/virtualenv/advanis/lib/python2.6/site-packages/suds/client.pyc in send(self, msg)
621 request = Request(location, str(msg))
622 request.headers = self.headers()
--> 623 reply = transport.send(request)
624 if retxml:
625 result = reply.message
/Users/crose/virtualenv/advanis/lib/python2.6/site-packages/suds/transport/https.pyc in send(self, request)
62 def send(self, request):
63 self.addcredentials(request)
---> 64 return HttpTransport.send(self, request)
65
66 def addcredentials(self, request):
/Users/crose/virtualenv/advanis/lib/python2.6/site-packages/suds/transport/http.pyc in send(self, request)
75 request.headers.update(u2request.headers)
76 log.debug('sending:\n%s', request)
---> 77 fp = self.u2open(u2request)
78 self.getcookies(fp, u2request)
79 result = Reply(200, fp.headers.dict, fp.read())
/Users/crose/virtualenv/advanis/lib/python2.6/site-packages/suds/transport/http.pyc in u2open(self, u2request)
116 return url.open(u2request)
117 else:
--> 118 return url.open(u2request, timeout=tm)
119
120 def u2opener(self):
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib2.pyc in open(self, fullurl, data, timeout)
381 req = meth(req)
382
--> 383 response = self._open(req, data)
384
385 # post-process response
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib2.pyc in _open(self, req, data)
399 protocol = req.get_type()
400 result = self._call_chain(self.handle_open, protocol, protocol +
--> 401 '_open', req)
402 if result:
403 return result
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib2.pyc in _call_chain(self, chain, kind, meth_name, *args)
359 func = getattr(handler, meth_name)
360
--> 361 result = func(*args)
362 if result is not None:
363 return result
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib2.pyc in http_open(self, req)
1128
1129 def http_open(self, req):
-> 1130 return self.do_open(httplib.HTTPConnection, req)
1131
1132 http_request = AbstractHTTPHandler.do_request_
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib2.pyc in do_open(self, http_class, req)
1103 r = h.getresponse()
1104 except socket.error, err: # XXX what error?
-> 1105 raise URLError(err)
1106
1107 # Pick apart the HTTPResponse object to get the addinfourl
URLError: <urlopen error [Errno 60] Operation timed out>
The cURL command is: cURL命令是:
/opt/local/bin/curl --ntlm -u "domain\user.name:userpass" -k -d @- -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; InfoPath.1)" -H "Connection: Keep-Alive" -H "Content-Type: text/xml; charset=utf-8" -H "SOAPAction: http://schemas.microsoft.com/crm/2007/WebServices/Execute" https://client.service.host/MSCrmServices/2007/MetadataService.asmx
The data that is piped to that cURL command: 通过管道传递给该cURL命令的数据:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Header>
<CrmAuthenticationToken xmlns="http://schemas.microsoft.com/crm/2007/WebServices">
<AuthenticationType xmlns="http://schemas.microsoft.com/crm/2007/CoreTypes">0</AuthenticationType>
<CrmTicket xmlns="http://schemas.microsoft.com/crm/2007/CoreTypes"></CrmTicket>
<OrganizationName xmlns="http://schemas.microsoft.com/crm/2007/CoreTypes">CMIFS</OrganizationName>
<CallerId xmlns="http://schemas.microsoft.com/crm/2007/CoreTypes">00000000-0000-0000-0000-000000000000</CallerId>
</CrmAuthenticationToken>
</soap:Header>
<soap:Body>
<Execute xmlns="http://schemas.microsoft.com/crm/2007/WebServices">
<Request xsi:type="RetrieveAttributeRequest">
<MetadataId>00000000-0000-0000-0000-000000000000</MetadataId>
<EntityLogicalName>opportunity</EntityLogicalName>
<LogicalName>new_typeofcontact</LogicalName>
<RetrieveAsIfPublished>false</RetrieveAsIfPublished>
</Request>
</Execute>
</soap:Body>
</soap:Envelope>
Here's the response: 这是回复:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<ExecuteResponse
xmlns="http://schemas.microsoft.com/crm/2007/WebServices">
<Response xsi:type="RetrieveAttributeResponse">
<AttributeMetadata xsi:type="PicklistAttributeMetadata">
<MetadataId>101346cf-a6af-4eb4-a4bf-9c3c6bbd6582</MetadataId>
<SchemaName>New_TypeofContact</SchemaName>
<LogicalName>new_typeofcontact</LogicalName>
<EntityLogicalName>opportunity</EntityLogicalName>
<AttributeType>
<Value>Picklist</Value>
</AttributeType>
<!-- stuff here -->
</AttributeMetadata>
</Response>
</ExecuteResponse>
</soap:Body>
</soap:Envelope>
It looks like you might be having a problem with the location in the WSDL. 看起来您可能在WSDL中遇到了位置问题。 If you check the debug output when it says it is sending:
如果在发送时检查调试输出:
DEBUG:suds.transport.http:sending:
URL:http://client.service.host/MSCrmServices/2007/MetadataService.asmx
Note that the URL is http, and that does not vibe with the initial connection, which was https. 请注意,URL是http,并且与初始连接(即https)不一致。
Try modifying the instantiation of your client by adding a location argument to force it to use https like so: 尝试通过添加location参数来修改客户端的实例化,以强制它使用https,如下所示:
svc_url = 'https://client.service.host/MSCrmServices/2007/MetadataService.asmx'
metadata_client = Client(wsdl_url, transport=ntlmTransport, location=svc_url)
(Note that the service URL should be the same of as the WSDL URL minus the ?WSDL
). (请注意,服务URL应与WSDL URL减去
?WSDL
)。
svc_url = 'https://client.service.host/MSCrmServices/2007/MetadataService.asmx'
metadata_client = Client(wsdl_url, transport=ntlmTransport, location=svc_url, cache=None)
Adding cache=None
actually do the trick. 添加
cache=None
实际诀窍。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.