Почему я получаю ошибку соединения / тайм-аут при использовании пены Python для соединения с Microsoft CRM?

Когда я пытаюсь соединиться с веб-сервисом CRM MS с помощью suds/python-ntlm, я получаю тайм-аут по запросам. Однако код, который я пытаюсь заменить - который обращается к ВИХРЕВОМУ приложению командной строки, чтобы сделать тот же вызов - успешно выполняется.

Очевидно что-то отличается в способе, которым ЗАВИХРЕНИЕ отправляет данные команды, но я буду проклят, если я буду знать, каково различие. Ниже полное изложение различных вызовов. Кто-либо получил какие-либо подсказки?

Вот код, который выполняет запрос, сопровождаемый выводом. ВИХРЕВОЙ код команды ниже этого, и его ответ следует. Хосты, пользователи и пароли были изменены для защиты невинного, конечно.

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>

ВИХРЕВАЯ команда:

/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>
6
задан Chris R 25 March 2010 в 22:52
поделиться

1 ответ

Похоже, у вас проблема с расположением в 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-адрес службы должен быть таким же, как URL-адрес WSDL за вычетом ? WSDL ).

4
ответ дан 17 December 2019 в 07:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: