为什么要使用XMLRPC
我们在对接一些政府项目的时候往往会遇到使用一些老技术 列如XML PRC
介绍
xml rpc是使用http协议做为传输协议的rpc机制,使用xml文本的方式传输命令和数据。一个rpc系统,必然包括2个部分:1.rpc client,用来向rpc server调用方法,并接收方法的返回数据;2.rpc server,用于响应rpc client的请求,执行方法,并回送方法执行结果。RPC是Remote Procedure Call的缩写,翻译成中文就是远程过程调用,是一种在本地的机器上调用远端机器上的一个过程(方法)的技术,这个过程也被大家称为“分布式计算”,是为了提高各个分立机器的“互操作性”而发明出来的技术。
xml的格式
请求格式
<?xml version="1.0" encoding="GBK" ?>
<methodCall>
<methodName>group.deleteGroup</methodName>
<params>
<param>
<value><int>16226</int></value>
</param>
</params>
</methodCall>
返回格式
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><string>South Dakota</string></value>
</param>
</params>
</methodResponse>
如何使用
库地址
https://github.com/Horizon0156/XmlRpc
如何使用
.Net Core WebApp作为服务端使用
- 安装
Horizon.XmlRpc.AspNetCore
和Horizon.XmlRpc.Core
包 - 注册服务端服务
rpc url路径为http://:/rpc - 创建
AddService
和IAddService
类
IAddService.cs
public interface IAddService
{
/// <summary>
/// Adds the numbers.
/// </summary>
/// <returns> Sum of the numbers .</returns>
/// <param name="numberA"> Summand a.</param>
/// <param name="numberB"> Summand b.</param>
[XmlRpcMethod("Demo.addNumbers")]
int AddNumbers(int numberA, int numberB
);
}
AddService.cs
public class AddService : XmlRpcService, IAddService
{
public int AddNumbers(int numberA, int numberB)
{
return numberA + numberB;
}
}
踩坑GBK的支持
encoding="GBK"
为GBK时需要额外配置
安装包
System.Text.Encoding.CodePages
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);//注册Nuget包System.Text.Encoding.CodePages中的编码到.NET Core
XML格式支持
services.AddControllersWithViews().AddXmlSerializerFormatters();
.Net Core WebApp作为服务端使用
安转扩展
- 安装
Horizon.XmlRpc.Client
包 和Horizon.XmlRpc.Core
包
- 代码如下
var proxy = XmlRpcProxyGen.Create<IAddServiceProxy>();
proxy.Url = "http://127.0.0.1:5678";
Console.WriteLine("Calling Demo.addNumbers with [3,4]...");
var result = proxy.AddNumbers(3, 4);
Console.WriteLine("Received result: " + result);
客户端实现
IAddServiceProxy
using Horizon.XmlRpc.Client;
namespace Horizon.XmlRpc.Core.ClientDemo
{
public interface IAddServiceProxy : IXmlRpcProxy
{
[XmlRpcMethod("Demo.addNumbers")]
int AddNumbers(int numberA, int numberB);
}
}