2010-03-25 42 views
6

當我嘗試使用肥皂水/蟒蛇,NTLM連接到MS CRM Web服務,我得到的請求超時。但是,我試圖替換的代碼(調用cURL命令行應用程序執行相同的調用)會成功。使用python泡沫連接到Microsoft CRM時,爲什麼會出現連接錯誤/超時?

顯然,事情是在捲曲發送命令數據的方式不同,但如果我知道兩者的區別是什麼,我會被定罪。以下是各種電話的完整細節。任何人有任何提示?

下面是發出請求,然後輸出代碼。 cURL命令代碼在下面,它的響應如下。當然,主機,用戶和密碼已經改變以保護無辜者。

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 

這裏的輸出:

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 

被管道輸送到該捲曲命令的數據:

 <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> 

這裏的響應:

<?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未被授權迴應,但處理程序是掛在迴應它,等待永遠不會到來的響應。這很奇怪,因爲剛剛成功使用完全相同的憑證(而不是以前的十分之一秒)從端點的?WSDL中檢索WSDL文件。 任何有識之士可以在這裏提供會來非常歡迎。 – 2010-03-25 22:51:46

回答

4

看起來你可能有與WSDL中的位置的問題。如果檢查調試輸出時,它說,它正在發送:

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 URL減去?WSDL )。

+0

我也試過,這是我注意到的第一件事,對不起,這個問題沒有反映出來。 – 2010-03-26 16:47:08

+0

你介意發佈WSDL的''部分的輸出嗎?它應該位於底部,並且是包含默認位置的部分。 – jathanism 2010-03-26 19:10:10

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實際上做的伎倆。