如何从XmlRpcClientProtocol.Invoke获取请求XML?错误请求排查方法
如何获取XmlRpc调用生成的请求XML字符串?
问题描述
我发送了一个错误的请求,想要排查问题所在,因此需要获取调用该方法后生成的请求XML字符串。以下是调用的方法代码:
using CookComputing.XmlRpc; private Object ExecuteMethod([CallerMemberName] String method= null, params Object[] parameters) { try { MethodInfo mein_metoda = GetType().GetMethod(method, BindingFlags.Instance |BindingFlags.NonPublic); return Invoke(mein_metoda, parameters); } catch (Exception ex_greska) { return null; } }
解决方案
你的ExecuteMethod是通过反射调用类内方法,但实际生成XML-RPC请求的核心逻辑在CookComputing.XmlRpc库的XmlRpcClientProtocol类里。要捕获请求XML,最直接的方式是重写该类的OnBeforeSendRequest方法——它会在请求正式发送前触发,刚好能帮我们拦截并提取XML内容。
具体操作步骤如下:
确保你的客户端类继承自XmlRpcClientProtocol
CookComputing的XML-RPC客户端必须基于这个基类工作,所以如果你的当前类还没继承它,先调整类定义:public class YourRpcClient : XmlRpcClientProtocol { // 你的现有代码(包括ExecuteMethod和XML-RPC方法) }重写OnBeforeSendRequest捕获XML内容
在类中添加这个重写方法,把请求XML从流中读取并保存:protected override void OnBeforeSendRequest(XmlWriter writer) { // 用StringWriter捕获XML输出 using var stringWriter = new StringWriter(); using var xmlCaptureWriter = XmlWriter.Create(stringWriter); // 让基类把请求内容写入我们的捕获writer base.OnBeforeSendRequest(xmlCaptureWriter); xmlCaptureWriter.Flush(); // 这里就是你要的请求XML字符串 string requestXml = stringWriter.ToString(); // 可以输出到控制台、写入日志,或者存到变量里用于排查 Console.WriteLine("生成的请求XML:\n" + requestXml); // 最后把捕获到的XML写入原始writer,保证请求能正常发送 writer.WriteRaw(requestXml); }测试调用
当你通过ExecuteMethod触发XML-RPC方法调用时,这个重写方法会自动执行,你就能拿到完整的请求XML了。
小提示
- 如果只是临时调试不需要发送请求,可以去掉
writer.WriteRaw(requestXml)这行,避免实际请求被发出。 - 若需要UTF-8编码的XML字符串,可以自定义
StringWriter的编码(默认是UTF-16),保证和实际请求编码一致。
内容的提问来源于stack exchange,提问作者Domagoj Hamzic
相关产品推荐
相关产品推荐

