踩坑:.Net Core 项目使用 XMLRPC

忘忧 2022年02月28日 273次浏览

为什么要使用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作为服务端使用

  1. 安装 Horizon.XmlRpc.AspNetCoreHorizon.XmlRpc.Core
  2. 注册服务端服务
    image.png
    image.png
    rpc url路径为http://
    :/rpc
  3. 创建AddServiceIAddService
    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作为服务端使用

安转扩展

  1. 安装 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);
    }
}