簡體   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