用C#语言开发一服务,让Python通过PO/PI的方式调用
2023-12-26 21:47:22
先说下为什么讲soap(后文开始是用 SOAP ):soap 这个东西在如今微服务普遍存在的时候,其实被诟病的地方不少,但历史沉淀的东西,尤其像 soap 这种,虽然出现的早,但至今依然可用,当然如果业务需要,还是有存在的价值。而且 SOAP 有规范,标准通用,不用担心兼容性的问题,还有一点 SOAP 协议是建立在HTTP上,HTTP 是个开放协议,也就是 SOAP 可以跑在多种语言中,但.net 可以通过 wshttp 协议,在内部可以同 rpc 或者其他协议关联,所以我们可以很方便在 Web 应用程序、Web Service、分布式对象之间传输数据。soap 的底层使用 XML 数据格式传输数据。
注意,不是 WCF + Web Api,而 WCF + SOAP。
WebService 是一个分布式的应用,它可以让我们通过网络互相通信。我们可以在某个电脑上使用 WCF 创建一个服务,然后在其他电脑上使用 WCF来调用这些服务。WebService 的一个特别之处是通信的方式。
我们使用 Soap 提供网络通信协议,那么就可以实现跨语言调用了,今天我们尝试使用 C# 的 WCF 构建一个简单的服务,然后使用 python 的 soaplib 去调用这个服务,当然 Python 中也有好多支持 SOAP 协议的库,如 zeep 等,当然原生带的 soap 依然还是好用。
话不多说,先上代码:
服务端:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
namespace service
{
[ServiceContract]
public interface ICalculator
{
[OperationContract]
int Add(int a, int b);
[OperationContract]
int Sub(int a, int b);
[OperationContract]
int Mul(int a, int b);
[OperationContract]
int Div(int a, int b);
}
public class Calculator : ICalculator
{
public int Add(int a, int b)
{
return a + b;
}
public int Sub(int a, int b)
{
return a - b;
}
public int Mul(int a, int b)
{
return a * b;
}
public int Div(int a, int b)
{
return a / b;
}
}
}
调用端:
from suds.client import Client
url = 'http://localhost:8000/CalculatorService?wsdl'
client = Client(url)
print(client.service.Add(1, 2))
print(client.service.Sub(3, 2))
print(client.service.Mul(4, 2))
print(client.service.Div(8, 2))
注意,这种方式有个明显缺点,就是每个服务都需要生成对应的 wsdl,依赖 wsdl 编译成客户端调用,如果使用 Python 的 xmlrpclib 或者 zeep 等,它们默认会产生代理类,使用起来更方便些,只需要配置一下,相当于是封装了 soap 协议,更方便开发,感兴趣可以了解下,今天的内容不多。