2010-03-25 15 views
6

जब मैं सूड/पायथन-एनटीएलएम का उपयोग कर एमएस सीआरएम वेब सेवा से कनेक्ट करने का प्रयास करता हूं, तो मुझे अनुरोधों पर टाइमआउट मिल रहा है। हालांकि, जिस कोड को मैं प्रतिस्थापित करने का प्रयास कर रहा हूं - जो एक ही कॉल करने के लिए 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> 
+1

थोड़ा और जानकारी: ऐसा लगता है कि कॉल को दूसरा 401 अधिकृत प्रतिक्रिया नहीं मिल रही है, लेकिन हैंडलर इसके जवाब में लटक रहा है, जो प्रतिक्रिया कभी नहीं आती है। यह अजीब बात है क्योंकि एंड्रॉइंट के डब्लूएसडीएल से डब्लूएसडीएल फाइल को पुनः प्राप्त करने के लिए, पहले ही वही प्रमाण-पत्रों का सफलतापूर्वक उपयोग किया गया है, एक सेकंड पहले दसवां नहीं। कोई अंतर्दृष्टि लोग यहां पेश कर सकते हैं बहुत स्वागत आएगा। –

उत्तर

4

ऐसा लगता है कि आपको डब्लूएसडीएल में स्थान के साथ समस्या हो सकती है। आप डिबग आउटपुट को चेक करते हैं, जब यह कहते हैं कि यह भेज रहा है:

DEBUG:suds.transport.http:sending: 
URL:http://client.service.host/MSCrmServices/2007/MetadataService.asmx 

ध्यान दें कि URL http है, और कहा कि प्रारंभिक कनेक्शन है, जो https था साथ भावनात्मक आत्मज्ञान नहीं है।

यह मजबूर करने के लिए एक स्थान तर्क जोड़कर अपने ग्राहक की इन्स्टेन्शियशन को संशोधित करने का प्रयास करें ताकि जैसे https का उपयोग करना:

svc_url = 'https://client.service.host/MSCrmServices/2007/MetadataService.asmx' 
metadata_client = Client(wsdl_url, transport=ntlmTransport, location=svc_url) 

(ध्यान दें कि सेवा URL डबल्यूएसडीएल यूआरएल के रूप में की एक ही शून्य से ?WSDL होना चाहिए)।

+0

मैंने भी कोशिश की है; यह पहली बात है जो मैंने देखा, खेद है कि सवाल इसे प्रतिबिंबित नहीं करता है। –

+0

क्या आप डब्ल्यूएसडीएल के '' भाग के आउटपुट को पोस्ट करना चाहते हैं? यह नीचे होना चाहिए और वह हिस्सा है जिसमें डिफ़ॉल्ट स्थान होता है। – jathanism

0
svc_url = 'https://client.service.host/MSCrmServices/2007/MetadataService.asmx' 
metadata_client = Client(wsdl_url, transport=ntlmTransport, location=svc_url, cache=None) 

cache=None जोड़ना वास्तव में चाल है।

संबंधित मुद्दे

 संबंधित मुद्दे