[英]Capture Raw XML from ASMX Webservice (client)
我有一个C#Winforms程序,该程序需要使用ASMX Web服务,因此需要从SOAP XML捕获请求/响应XML并将其存储到数据库中。
我读了很多文章,建议使用SoapExtension来捕获XML,但据我所知,所有解决方案都不是线程安全的,它只是获取最后捕获的XML并假设它是一个。 。
例如下面的链接:
要查看SOAP信封,只需在发布请求后立即访问TraceExtension.XmlRequest和TraceExtension.XmlResponse XmlDocument属性。
我的程序期望有很多并发进程在运行,如果流量很少,上述解决方案肯定会起作用,但是我的客户希望有一个更体面的解决方案来消除所有风险。
有什么建议吗?
如果您遵循.Net Windows Form Client中的建议。 从ASMX webservice捕获请求/响应SOAP ,但是将使用者配置为使用“服务引用”而不是“ Web引用”,则可以在app.config
使用WCF跟踪:
<system.diagnostics>
<!-- add global listener: http://msdn.microsoft.com/en-us/library/b0ectfxd(v=vs.100).aspx -->
<trace autoflush="true">
<listeners>
<add name="nlog" /> <!-- or whatever you registered in sharedListeners -->
</listeners>
</trace>
<!-- nlog trace listeners: http://nlog-project.org/2010/09/02/routing-system-diagnostics-trace-and-system-diagnostics-tracesource-logs-through-nlog.html -->
<sharedListeners>
<add name="nlog" type="NLog.NLogTraceListener, NLog" />
<add name="TraceFile" type="System.Diagnostics.TextWriterTraceListener"
initializeData="trace.log"/>
</sharedListeners>
<!-- add SOAP listener: https://stackoverflow.com/questions/300674/getting-raw-soap-data-from-a-web-reference-client-running-in-asp-net -->
<sources>
<source name="System.Net" tracemode="protocolonly" maxdatasize="512000" switchValue="All">
<listeners>
<add name="nlog"/>
</listeners>
</source>
<!-- the others, like `System.Net.Sockets` and `System.ServiceModel` don't seem to do much -->
</sources>
</system.diagnostics>
如您所说,链接到的示例不起作用,因为它公开了静态xmlrequest和xmlresponse字段,可以在记录它们之前对其进行修改。 但是,该示例确实演示了如何编写自己的SoapExtension(可能名为AuditSoapExtension或PersistSoapExtension),将这些信息保存到ProcessMessage方法中的数据库中。
请注意,这对于每个请求来说都是很大的开销,如果您的负载将如您所建议的那样高,则可以考虑将持久性排队或批处理到实际数据库。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.