//------------------------------------------------------------------------------ // 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 // 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 // CSDN博客:https://blog.csdn.net/qq_40374647 // 哔哩哔哩视频:https://space.bilibili.com/94253567 // Gitee源代码仓库:https://gitee.com/RRQM_Home // Github源代码仓库:https://github.com/RRQM // API首页:https://www.yuque.com/rrqm/touchsocket/index // 交流QQ群:234762506 // 感谢您的下载和使用 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ using System; using System.Threading.Tasks; using System.Xml; using TouchSocket.Core; using TouchSocket.Http; using TouchSocket.Rpc.TouchRpc; namespace TouchSocket.Rpc.XmlRpc { /// /// XmlRpc客户端 /// public class XmlRpcClient : HttpClientBase, IXmlRpcClient { private readonly object m_invokeLocker = new object(); /// /// /// public Func TryCanInvoke { get; set; } /// /// Rpc调用 /// /// 方法名 /// 调用配置 /// 参数 /// /// /// /// /// public T Invoke(string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) { lock (m_invokeLocker) { if (invokeOption == default) { invokeOption = InvokeOption.WaitInvoke; } using (ByteBlock byteBlock = new ByteBlock(BufferLength)) { HttpRequest request = XmlDataTool.CreateRequest(RemoteIPHost.Host, RemoteIPHost.GetUrlPath(), method, parameters); HttpResponse response = RequestContent(request, invokeOption.FeedbackType == FeedbackType.OnlySend, invokeOption.Timeout, invokeOption.Token); if (invokeOption.FeedbackType != FeedbackType.WaitInvoke) { return default; } if (response.StatusCode != "200") { throw new Exception(response.StatusMessage); } else { XmlDocument xml = new XmlDocument(); xml.LoadXml(response.GetBody()); XmlNode paramNode = xml.SelectSingleNode("methodResponse/params/param"); if (paramNode != null) { return (T)XmlDataTool.GetValue(paramNode.FirstChild.FirstChild, typeof(T)); } return default; } } } } /// /// Rpc调用 /// /// 方法名 /// 调用配置 /// 参数 /// /// /// /// public void Invoke(string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) { lock (m_invokeLocker) { if (invokeOption == default) { invokeOption = InvokeOption.WaitInvoke; } using (ByteBlock byteBlock = new ByteBlock(BufferLength)) { HttpRequest request = XmlDataTool.CreateRequest(RemoteIPHost.Host, RemoteIPHost.GetUrlPath(), method, parameters); var response = RequestContent(request, invokeOption.FeedbackType == FeedbackType.OnlySend, invokeOption.Timeout, invokeOption.Token); if (invokeOption.FeedbackType != FeedbackType.WaitInvoke) { return; } if (response.StatusCode != "200") { throw new Exception(response.StatusMessage); } } } } /// /// Rpc调用 /// /// 方法名 /// 调用配置 /// 参数 /// /// /// public void Invoke(string method, IInvokeOption invokeOption, params object[] parameters) { Invoke(method, invokeOption, ref parameters, null); } /// /// Rpc调用 /// /// 方法名 /// 调用配置 /// 参数 /// /// /// /// public T Invoke(string method, IInvokeOption invokeOption, params object[] parameters) { return Invoke(method, invokeOption, ref parameters, null); } /// /// 函数式调用 /// /// 函数名 /// 参数 /// Rpc调用设置 /// /// /// /// public Task InvokeAsync(string method, IInvokeOption invokeOption, params object[] parameters) { return EasyTask.Run(() => { Invoke(method, invokeOption, parameters); }); } /// /// 函数式调用 /// /// 方法名 /// 参数 /// Rpc调用设置 /// 调用超时 /// 序列化异常 /// Rpc异常 /// 其他异常 /// 服务器返回结果 public Task InvokeAsync(string method, IInvokeOption invokeOption, params object[] parameters) { return EasyTask.Run(() => { return Invoke(method, invokeOption, parameters); }); } } }