WCF и Python

Есть ли какой-либо пример кода клиента cpython (не IronPython), который может вызывать службу Windows Communication Foundation (WCF)?

Можем ли мы с уверенностью предположить, что вы пытаетесь вызвать службу на основе SOAP или REST через HTTP? Я сомневаюсь, что какой-то COM-мост между Python и клиентом WCF сможет успешно вызвать службу TCP WCF.

technomalogical 10.11.2008 00:46
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
24
1
30 793
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Даже если нет конкретного примера вызова WCF из Python, вы сможете создать полностью совместимую с SOAP службу с помощью WCF. Тогда все, что вам нужно сделать, это найти несколько примеров того, как вызвать обычную службу SOAP из Python.

Самым простым будет использование BasicHttpBinding в WCF, а затем вы сможете поддерживать свои собственные сеансы, передав токен сеанса с каждым запросом и ответом.

Ответ принят как подходящий

WCF необходимо предоставлять функциональные возможности через протокол связи. Я думаю, что наиболее часто используемый протокол - это, вероятно, SOAP поверх HTTP. Предположим, что это что вы тогда используете.

Взгляните на эта глава в Dive Into Python. Он покажет вам, как совершать вызовы по протоколу SOAP.

Я не знаю единого способа вызова службы WCF в Python, независимо от связи протокол.

У меня работает только basicHttpBinding. Если кто-нибудь знает, как заставить работать wsHttpBinding, опубликуйте его и здесь.

Sleeper Smith 21.06.2011 05:35

Ссылка больше не работает у меня 21.10.2019, я думаю, это действующая новая ссылка: linux.die.net/diveintopython/html/soap_web_services/index.ht‌ ml

Intrastellar Explorer 22.10.2019 05:12

Спасибо. Я отредактировал ответ, включив в него вашу новую ссылку.

Dan 03.01.2020 22:58

Я не знаю каких-либо прямых примеров, но если для службы 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, откуда взять пену?

Itay Levin 24.11.2014 15:35

@ItalyLevin вам нужно использовать pip.

stephen 18.03.2015 18:26

Я получил ошибку Нет модуля с именем 'client' при попытке установить с помощью pip в Windows 7

user2258651 09.08.2017 16:39

Если у вас установлен 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)

r3nrut 06.11.2017 18:56

Просто чтобы помочь кому-то получить доступ к службе 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):

  • пена в значительной степени мертва (даже не может установить его на python 3)
  • suds-jurko кажется мертвым. В выпуске 0.6 есть очень раздражающая ошибка бесконечной рекурсии (по крайней мере, в WSDL, предоставляемом нашей службой), которая исправлена ​​в подсказке, но не выпущена, и прошло 1,5 года (на момент написания этой статьи в феврале 2017 г.) с момента последнего совершить.
    Он работает на Python 3, но не поддерживает SOAP 1.2. Ответ Советникова - это попытка заставить его работать с 1.2, но мне не удалось заставить его работать для меня.
  • Похоже, что zeep - это текущий способ пойти и работать из коробки (я не связан с zeep, он просто работает для меня, и я провел несколько часов, ударяясь головой о кирпичную стену, пытаясь заставить работать мыльную пену). Для работы zeep конфигурация узла службы WCF должна включать <security mode = "None" /> в узле wsHttpBinding. На самом деле zeep, кажется, поддерживает имя пользователя и подпись (x509) на основе WS-SE, но я не пробовал этого, поэтому не могу говорить ни о каких проблемах вокруг него.

Можете ли вы добавить пример того, как реализовать wsHttpBinding, застряв в течение нескольких часов, не можете его реализовать.

harshil9968 31.08.2017 21:03

@ harshil9968: Не уверен на 100%, что тебе нужно. Создать zeep-клиент так же просто, как и client = zeep.Client('http://computerip:port/myservice/?wsdl'). Как создать реализацию службы WCF немного выходит за рамки этого вопроса

ChrisWue 01.09.2017 04:51

это создается с привязкой к http, а не с привязкой wshttp. Из-за этого я получаю сообщение об ошибке от клиента.

harshil9968 01.09.2017 11:42

Есть ли что-нибудь вокруг вашего последнего маркера? Я пытаюсь использовать услуги поставщика и не думаю, что они захотят изменить это только для нас.

Harabeck 01.02.2018 19:11

@Harabeck - Похоже, поддержка WSSE теперь доступна (docs.python-zeep.org/en/master/wsse.html)

ChrisWue 12.04.2018 01:34

Другие вопросы по теме