从ASMX Web服务(客户端)捕获原始XML

时间:2014-01-03 08:02:25

标签: c# winforms asmx webservice-client

我有一个需要使用ASMX Web服务的C#Winforms程序,需要从SOAP XML捕获请求/响应XML并存储到数据库中。

我已经阅读了很多建议使用SoapExtension来捕获XML的文章,但据我所知,所有解决方案都不是线程安全的,它只是简单地抓取最后捕获的XML并假设它是这个。

以下示例链接:

http://blog.encoresystems.net/articles/how-to-capture-soap-envelopes-when-consuming-a-web-service.aspx

要查看SOAP信封,只需在发布请求后立即访问TraceExtension.XmlRequest和TraceExtension.XmlResponse XmlDocument属性。

我的程序预计会有很多并发进程在运行,如果流量很低,上述解决方案肯定会有用,但我的客户期待更合适的解决方案,以消除所有风险。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

如果您遵循.Net Windows Form Client. Capturing Request/Response SOAP from ASMX webservice中的建议,但配置您的消费者使用"服务参考"而不是" Web References"您可以在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>

答案 1 :(得分:0)

正如你所说,链接的示例不起作用,因为它暴露了静态xmlrequest和xmlresponse字段,可以在记录之前对其进行修改。但是,该示例确实演示了如何编写自己的SoapExtension,可能名为AuditSoapExtension或PersistSoapExtension,它将在ProcessMessage方法中将信息保存到数据库中。

请注意,对于每个请求来说,这是一个很大的开销,如果您的负载将达到您建议的最高水平,您可以查看将持久性排队或批处理到实际数据库。