Có mã ví dụ nào của ứng dụng khách cpython (không phải IronPython) có thể gọi dịch vụ Windows Communication Foundation (WCF) không?WCF và Python
Trả lời
WCF cần hiển thị chức năng thông qua giao thức truyền thông. Tôi nghĩ rằng giao thức được sử dụng phổ biến nhất có lẽ là SOAP qua HTTP. Giả sử đó là những gì bạn đang sử dụng sau đó.
Hãy xem this chapter in Dive Into Python. Nó sẽ cho bạn thấy làm thế nào để thực hiện cuộc gọi SOAP.
Tôi biết không có cách nào thống nhất gọi dịch vụ WCF bằng Python, bất kể giao thức là gì.
Tôi chỉ có basicHttpBinding hoạt động. Nếu có ai biết làm thế nào để có được wsHttpBinding để làm việc, xin vui lòng gửi nó ở đây là tốt. –
Thậm chí nếu không có ví dụ cụ thể về việc gọi WCF từ Python, bạn sẽ có thể thực hiện dịch vụ tuân thủ SOAP hoàn toàn với WCF. Sau đó, tất cả những gì bạn phải làm là tìm một số ví dụ về cách gọi một dịch vụ SOAP bình thường từ Python.
Điều đơn giản nhất là sử dụng BasicHttpBinding trong WCF và sau đó bạn có thể hỗ trợ phiên của riêng mình bằng cách chuyển mã thông báo phiên với mỗi yêu cầu và phản hồi.
Tôi không biết bất kỳ ví dụ trực tiếp nào, nhưng nếu dịch vụ WCF được kích hoạt REST, bạn có thể truy cập thông qua POX (Plain Old XML) qua phương thức REST/etc (nếu dịch vụ có). Nếu bạn có quyền kiểm soát dịch vụ, bạn cũng có thể phơi bày điểm cuối thông qua REST.
nếu bạn cần giao tiếp tuần tự hóa nhị phân trên tcp thì hãy xem xét triển khai giải pháp như Tiết kiệm.
Tôi đã sử dụng suds.
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
Điều đó sẽ giúp bạn bắt đầu. Tôi có thể kết nối với các dịch vụ tiếp xúc từ WCF và một lớp RESTful. Có cần phải có một số dữ liệu mát xa để giúp làm những gì bạn cần, đặc biệt là nếu bạn cần phải liên kết với một số không gian tên.
Không có mô-đun nào có tên suds.client, bạn lấy từ đâu ra? –
@ItalyLevin bạn cần sử dụng pip. – stephen
Tôi gặp lỗi Không có mô-đun có tên 'khách hàng' khi cố gắng cài đặt bằng pip trên Windows 7 – user2258651
Chỉ để giúp một người nào đó truy cập dịch vụ WCF SOAP 1.2 với WS-Addressing bằng cách sử dụng suds. Vấn đề chính là đưa tên hành động vào mọi thư.
Ví dụ này cho cổng python 3 và suds https://bitbucket.org/jurko/suds.
Ví dụ sử dụng xác thực tùy chỉnh dựa trên tiêu đề HTTP, tôi để nguyên trạng thái này.
TODO: Tự động nhận api_direct_url từ WSDL (lúc này mã được mã hóa cứng).
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: Đối với wsHttpBinding (SOAP 1.2) sử dụng zeep
Trong trường hợp ai đó đang gặp khó khăn trong sử dụng bọt (hoặc bọt-jurko cho rằng vấn đề) với WCF và wsHttpBinding (đó là SOAP 1.2):
- bọt là khá nhiều người chết (thậm chí không thể pip cài đặt nó trên python 3)
- bọt-jurko dường như loại của người chết. Bản phát hành 0.6 có lỗi đệ quy vô hạn rất khó chịu (ít nhất là trên WSDL mà dịch vụ của chúng tôi tiếp xúc) được sửa trong đầu nhưng không được phát hành và nó đã được 1.5 năm (tại thời điểm viết bài này trong Feb'17) kể từ lần commit cuối cùng.
Nó hoạt động trên trăn 3 nhưng không hỗ trợ SOAP 1.2. Sovetnikov's answer là một nỗ lực để làm cho nó hoạt động với 1,2 nhưng tôi đã không quản lý để làm cho nó làm việc cho tôi. - zeep dường như là cách hiện tại để đi và làm việc ra khỏi hộp (Tôi không liên kết với zeep, nó chỉ hoạt động cho tôi và tôi đã dành vài giờ đập đầu của tôi chống lại một bức tường gạch cố gắng để làm cho suds làm việc) . Để zeep hoạt động, cấu hình máy chủ dịch vụ WCF phải bao gồm < chế độ bảo mật = "Không"/> trong nút wsHttpBinding.
bạn có thể thêm một ví dụ về cách triển khai wsHttpBinding, bị mắc kẹt không cho giờ không thể thực hiện nó – harshil9968
@ harshil9968: Không chắc chắn 100% những gì bạn đang sau. Instantiating một khách hàng zeep là đơn giản như 'client = zeep.Client ('http: // computerip: port/myservice /? wsdl ') '.Làm thế nào để tạo ra một thực hiện dịch vụ WCF là một chút ra khỏi phạm vi cho câu hỏi này – ChrisWue
này tạo ra với http ràng buộc, không phải là wshttp-ràng buộc.Tôi nhận được lỗi từ khách hàng vì điều đó. – harshil9968
- 1. WCF và Java
- 2. WCF và xác thực
- 3. WCF và System.Configuration namespace
- 4. WCF 3.5 và UDP
- 5. Kênh WCF và ChannelFactory Caching
- 6. Dịch vụ WCF và Luồng
- 7. Đi qua Python Danh sách đến dịch vụ WCF
- 8. WCF - ưu điểm và nhược điểm
- 9. Sao chổi WCF và chủ đề
- 10. Selfhosted WCF và SSL (Một lần nữa)
- 11. Truyền trực tuyến với WCF và MTOM
- 12. Xử lý lỗi WCF và MSMQ
- 13. Wcf và giao diện làm thông số
- 14. Máy khách Java WCF và IncludeTimestamp
- 15. Dịch vụ WCF và Dịch vụ Windows
- 16. WCF và 127.0.0.1 so với localhost
- 17. Gọi lại WCF, proxy và thread-safety
- 18. Phong bì SOAP Delphi và WCF
- 19. Đóng và hủy dịch vụ WCF
- 20. Kiến trúc WCF và Evolution, Phiên bản
- 21. Sự khác biệt giữa Dịch vụ WCF, Dịch vụ WCF RIA và Dịch vụ Dữ liệu WCF
- 22. WCF và các yêu cầu và phản hồi trực tuyến
- 23. Các tham số có tên và tùy chọn, và WCF
- 24. Sự khác biệt giữa WCF Web API và WCF Data Services
- 25. Thư viện thống nhất và WCF: Nơi tải tính thống nhất trong thư viện wcf?
- 26. WCF wsHttpBinding và BasicHttpBinding trong cùng một Ứng dụng Dịch vụ WCF
- 27. WCF: Cách tắt WCF Test Client
- 28. Hiểu WCF
- 29. WCF và giao diện trên dữ liệu hợp đồng
- 30. Connect và xác thực để SharePoint với WCF
Chúng tôi có thể giả định rằng bạn đang cố gắng gọi dịch vụ dựa trên SOAP hoặc REST qua HTTP không? Tôi nghi ngờ ngắn của một số loại COM cầu giữa Python và một khách hàng WCF sẽ có thể thành công gọi một dịch vụ WCF TCP. – technomalogical