





Даже если нет конкретного примера вызова WCF из Python, вы сможете создать полностью совместимую с SOAP службу с помощью WCF. Тогда все, что вам нужно сделать, это найти несколько примеров того, как вызвать обычную службу SOAP из Python.
Самым простым будет использование BasicHttpBinding в WCF, а затем вы сможете поддерживать свои собственные сеансы, передав токен сеанса с каждым запросом и ответом.
WCF необходимо предоставлять функциональные возможности через протокол связи. Я думаю, что наиболее часто используемый протокол - это, вероятно, SOAP поверх HTTP. Предположим, что это что вы тогда используете.
Взгляните на эта глава в Dive Into Python. Он покажет вам, как совершать вызовы по протоколу SOAP.
Я не знаю единого способа вызова службы WCF в Python, независимо от связи протокол.
У меня работает только basicHttpBinding. Если кто-нибудь знает, как заставить работать wsHttpBinding, опубликуйте его и здесь.
Ссылка больше не работает у меня 21.10.2019, я думаю, это действующая новая ссылка: linux.die.net/diveintopython/html/soap_web_services/index.ht ml
Спасибо. Я отредактировал ответ, включив в него вашу новую ссылку.
Я не знаю каких-либо прямых примеров, но если для службы WCF включен REST, вы можете получить к ней доступ через POX (простой старый XML) с помощью методов REST / и т. д. (Если у службы есть). Если вы контролируете службу, вы также можете предоставлять конечные точки через REST.
если вам нужна двоичная сериализованная связь через TCP, подумайте о реализации такого решения, как Thrift.
Я использовал пена.
from suds.client import Client
print "Connecting to Service..."
wsdl = "http://serviceurl.com/service.svc?WSDL"
client = Client(wsdl)
result = client.service.Method(variable1, variable2)
print result
Это должно вас начать. Я могу подключаться к открытым службам из WCF и уровня RESTful. Должен быть некоторый обмен данными, чтобы помочь сделать то, что вам нужно, особенно если вам нужно выполнить привязку к нескольким пространствам имен.
Нет модуля с именем suds.client, откуда взять пену?
@ItalyLevin вам нужно использовать pip.
Я получил ошибку Нет модуля с именем 'client' при попытке установить с помощью pip в Windows 7
Если у вас установлен python и вы использовали pip для установки пакета suds, вы сможете импортировать Client. Если у вас по-прежнему возникают проблемы, вы можете попытаться запустить отладку. Документы, найденные здесь: webkul.com/blog/python-suds-client Для полной отладки вывода используйте следующие методы. import logging logging.basicConfig (level = logging.INFO) logging.getLogger ('suds.client'). setLevel (logging.DEBUG) logging.getLogger ('suds.transport'). setLevel (logging.DEBUG) logging.getLogger ( 'suds.xsd.schema'). setLevel (logging.DEBUG logging.getLogger ('suds.wsdl'). setLevel (logging.DEBUG)
Просто чтобы помочь кому-то получить доступ к службе WCF SOAP 1.2 с WS-Addressing с помощью пены. Основная проблема - вставлять название действия в каждое сообщение.
Этот пример для python 3 и порта для пены https://bitbucket.org/jurko/suds.
В примере используется настраиваемая аутентификация на основе заголовков HTTP, я оставляю все как есть.
ЗАДАЧА: автоматически получать api_direct_url из WSDL (сейчас он жестко запрограммирован).
from suds.plugin import MessagePlugin
from suds.sax.text import Text
from suds.wsse import Security, UsernameToken
from suds.sax.element import Element
from suds.sax.attribute import Attribute
from suds.xsd.sxbasic import Import
api_username = 'some'
api_password = 'none'
class api(object):
api_direct_url = 'some/mex'
api_url = 'some.svc?singleWsdl|Wsdl'
NS_WSA = ('wsa', 'http://www.w3.org/2005/08/addressing')
_client_instance = None
@property
def client(self):
if self._client_instance:
return self._client_instance
from suds.bindings import binding
binding.envns = ('SOAP-ENV', 'http://www.w3.org/2003/05/soap-envelope')
api_inst = self
class _WSAPlugin(MessagePlugin):
def marshalled(self, context):
api_inst._marshalled_message(context)
self._client_instance = Client(self.api_url,
plugins=[_WSAPlugin()],
headers = {'Content-Type': 'application/soap+xml',
'login':api_username,
'password': api_password}
)
headers = []
headers.append(Element('To', ns=self.NS_WSA).setText(self.api_direct_url))
headers.append(Element('Action', ns=self.NS_WSA).setText('Blank'))
self._client_instance.set_options(soapheaders=headers)
cache = self._client_instance.options.cache
cache.setduration(days=10)
return self._client_instance
def _marshalled_message(self, context):
def _children(r):
if hasattr(r, 'children'):
for c in r.children:
yield from _children(c)
yield c
for el in _children(context.envelope):
if el.name == 'Action':
el.text = Text(self._current_action)
return
_current_action = None
def _invoke(self, method, *args):
try:
self._current_action = method.method.soap.action.strip('"')
return method(*args)
finally:
self._current_action = None
def GetRequestTypes(self):
return self._invoke(self.client.service.GetRequestTypes)[0]
def GetTemplateByRequestType(self, request_type_id):
js = self._invoke(self.client.service.GetTemplateByRequestType, request_type_id)
return json.loads(js)
def GetRequestStatus(self, request_guid):
return self._invoke(self.client.service.GetRequestStatus, request_guid)
def SendRequest(self, request_type_id, request_json):
r = json.dumps(request_json, ensure_ascii=False)
return self._invoke(self.client.service.SendRequest, request_type_id, r)
TL; DR: для wsHttpBinding (SOAP 1.2) используйте зип
В случае, если у кого-то возникнут проблемы с использованием пены (или suds-jurko, если на то пошло) с WCF и wsHttpBinding (это SOAP 1.2):
Можете ли вы добавить пример того, как реализовать wsHttpBinding, застряв в течение нескольких часов, не можете его реализовать.
@ harshil9968: Не уверен на 100%, что тебе нужно. Создать zeep-клиент так же просто, как и client = zeep.Client('http://computerip:port/myservice/?wsdl'). Как создать реализацию службы WCF немного выходит за рамки этого вопроса
это создается с привязкой к http, а не с привязкой wshttp. Из-за этого я получаю сообщение об ошибке от клиента.
Есть ли что-нибудь вокруг вашего последнего маркера? Я пытаюсь использовать услуги поставщика и не думаю, что они захотят изменить это только для нас.
@Harabeck - Похоже, поддержка WSSE теперь доступна (docs.python-zeep.org/en/master/wsse.html)
Можем ли мы с уверенностью предположить, что вы пытаетесь вызвать службу на основе SOAP или REST через HTTP? Я сомневаюсь, что какой-то COM-мост между Python и клиентом WCF сможет успешно вызвать службу TCP WCF.