जब मैं सूड/पायथन-एनटीएलएम का उपयोग कर एमएस सीआरएम वेब सेवा से कनेक्ट करने का प्रयास करता हूं, तो मुझे अनुरोधों पर टाइमआउट मिल रहा है। हालांकि, जिस कोड को मैं प्रतिस्थापित करने का प्रयास कर रहा हूं - जो एक ही कॉल करने के लिए curl कमांड लाइन ऐप पर कॉल करता है - सफल होता है।माइक्रोसॉफ्ट सीआरएम से कनेक्ट करने के लिए पाइथन सूड का उपयोग करते समय मुझे कनेक्शन त्रुटि/टाइमआउट क्यों मिलता है?
स्पष्ट रूप से कुछ ऐसा है जो curl कमांड डेटा भेज रहा है, लेकिन अगर मुझे पता है कि अंतर क्या है तो मैं शापित हो जाऊंगा। नीचे विभिन्न कॉल का पूरा विवरण दिया गया है। किसी को कोई सुझाव मिला है?
यहां कोड है जो अनुरोध कर रहा है, आउटपुट के बाद। Curl कमांड कोड उस से नीचे है, और इसकी प्रतिक्रिया निम्नानुसार है। निश्चित रूप से निर्दोषों की रक्षा के लिए मेजबान, उपयोगकर्ता और पासवर्ड बदल दिए गए हैं।
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>
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
डेटा है कि कि 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>
यहाँ प्रतिक्रिया है
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
यहाँ उत्पादन है :
<?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>
थोड़ा और जानकारी: ऐसा लगता है कि कॉल को दूसरा 401 अधिकृत प्रतिक्रिया नहीं मिल रही है, लेकिन हैंडलर इसके जवाब में लटक रहा है, जो प्रतिक्रिया कभी नहीं आती है। यह अजीब बात है क्योंकि एंड्रॉइंट के डब्लूएसडीएल से डब्लूएसडीएल फाइल को पुनः प्राप्त करने के लिए, पहले ही वही प्रमाण-पत्रों का सफलतापूर्वक उपयोग किया गया है, एक सेकंड पहले दसवां नहीं। कोई अंतर्दृष्टि लोग यहां पेश कर सकते हैं बहुत स्वागत आएगा। –