【问题标题】:Capture Raw XML from ASMX Webservice (client)从 ASMX Web 服务(客户端)捕获原始 XML
【发布时间】:2014-01-20 20:34:43
【问题描述】:

我有一个需要使用 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 属性。

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

有什么建议吗?

【问题讨论】:

    标签: c# winforms asmx webservice-client


    【解决方案1】:

    如果您遵循 .Net Windows Form Client. Capturing Request/Response SOAP from ASMX webservice 中的建议,但将您的使用者配置为使用“服务引用”而不是“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>
    

    【讨论】:

      【解决方案2】:

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

      请注意,这对于每个请求来说都是很多开销,如果您的负载将达到您所建议的那样高,您可能会考虑将持久性排队或批处理到实际数据库。

      【讨论】:

      • 我需要在进程线程中获取XML,以便将XML与其他信息一起存储。
      • 看例子中的ProcessMessage方法。 SoapExtension 在同一个线程上调用。在消息生命周期的不同阶段调用该方法。您应该能够了解自己需要做什么,然后在需要有关具体细节的其他帮助时跟进。
      • 如果您还需要在上下文中记录其他数据,只需将它们添加为自定义肥皂标题并让扩展完成所有工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      • 2014-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-07
      相关资源
      最近更新 更多