我有一个需要使用ASMX Web服务的C#Winforms程序,需要从SOAP XML捕获请求/响应XML并存储到数据库中。
我已经阅读了很多建议使用SoapExtension来捕获XML的文章,但据我所知,所有解决方案都不是线程安全的,它只是简单地抓取最后捕获的XML并假设它是这个。
以下示例链接:
要查看SOAP信封,只需在发布请求后立即访问TraceExtension.XmlRequest和TraceExtension.XmlResponse XmlDocument属性。
我的程序预计会有很多并发进程在运行,如果流量很低,上述解决方案肯定会有用,但我的客户期待更合适的解决方案,以消除所有风险。
有什么建议吗?
答案 0 :(得分:1)
如果您遵循.Net Windows Form Client. Capturing Request/Response SOAP from ASMX webservice中的建议,但配置您的消费者使用"服务参考"而不是" Web References"您可以在app.config
:
<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>
答案 1 :(得分:0)
正如你所说,链接的示例不起作用,因为它暴露了静态xmlrequest和xmlresponse字段,可以在记录之前对其进行修改。但是,该示例确实演示了如何编写自己的SoapExtension,可能名为AuditSoapExtension或PersistSoapExtension,它将在ProcessMessage方法中将信息保存到数据库中。
请注意,对于每个请求来说,这是一个很大的开销,如果您的负载将达到您建议的最高水平,您可以查看将持久性排队或批处理到实际数据库。