繁体   English   中英

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

[英]Capture Raw XML from ASMX Webservice (client)

我有一个C#Winforms程序,该程序需要使用ASMX Web服务,因此需要从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属性。

我的程序期望有很多并发进程在运行,如果流量很少,上述解决方案肯定会起作用,但是我的客户希望有一个更体面的解决方案来消除所有风险。

有什么建议吗?

如果您遵循.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM