簡體   English   中英

記錄非.Net SOAP Web服務的肥皂請求和響應

[英]Log soap request and response for non .Net SOAP web services

我在.net應用程序中未使用.Net SOAP Web服務(ESB服務)。 我已添加參考或使用添加網絡參考的服務。

現在,當我調用該服務的任何方法時,我想記錄肥皂請求和響應。 我想將請求/響應存儲在數據庫中。

誰能告訴我如何在C#中記錄.Net SOAP Web服務的Soap請求和響應?

這段代碼來自這篇文章,任何編寫的代碼都不是我的^^

您可以實現SoapExtension,將完整的請求和響應記錄到日志文件中。 然后,您可以在web.config中啟用SoapExtension,從而可以輕松打開/關閉進行調試。 這是我發現並修改以供自己使用的示例,在我的情況下,日志記錄是由log4net完成的,但是您可以用自己的日志方法替換。

public class SoapLoggerExtension : SoapExtension
{
    private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
    private Stream oldStream;
    private Stream newStream;

public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
{
    return null;
}

public override object GetInitializer(Type serviceType)
{
    return null;
}

public override void Initialize(object initializer)
{

}

public override System.IO.Stream ChainStream(System.IO.Stream stream)
{
    oldStream = stream;
    newStream = new MemoryStream();
    return newStream;
}

public override void ProcessMessage(SoapMessage message)
{

    switch (message.Stage)
    {
        case SoapMessageStage.BeforeSerialize:
            break;
        case SoapMessageStage.AfterSerialize:
            Log(message, "AfterSerialize");
                CopyStream(newStream, oldStream);
                newStream.Position = 0;
            break;
            case SoapMessageStage.BeforeDeserialize:
                CopyStream(oldStream, newStream);
                Log(message, "BeforeDeserialize");
            break;
        case SoapMessageStage.AfterDeserialize:
            break;
    }
}

public void Log(SoapMessage message, string stage)
{

    newStream.Position = 0;
    string contents = (message is SoapServerMessage) ? "SoapRequest " : "SoapResponse ";
    contents += stage + ";";

    StreamReader reader = new StreamReader(newStream);

    contents += reader.ReadToEnd();

    newStream.Position = 0;

    log.Debug(contents);
}

void ReturnStream()
{
    CopyAndReverse(newStream, oldStream);
}

void ReceiveStream()
{
    CopyAndReverse(newStream, oldStream);
}

public void ReverseIncomingStream()
{
    ReverseStream(newStream);
}

public void ReverseOutgoingStream()
{
    ReverseStream(newStream);
}

public void ReverseStream(Stream stream)
{
    TextReader tr = new StreamReader(stream);
    string str = tr.ReadToEnd();
    char[] data = str.ToCharArray();
    Array.Reverse(data);
    string strReversed = new string(data);

    TextWriter tw = new StreamWriter(stream);
    stream.Position = 0;
    tw.Write(strReversed);
    tw.Flush();
}
void CopyAndReverse(Stream from, Stream to)
{
    TextReader tr = new StreamReader(from);
    TextWriter tw = new StreamWriter(to);

    string str = tr.ReadToEnd();
    char[] data = str.ToCharArray();
    Array.Reverse(data);
    string strReversed = new string(data);
    tw.Write(strReversed);
    tw.Flush();
}

private void CopyStream(Stream fromStream, Stream toStream)
{
    try
    {
        StreamReader sr = new StreamReader(fromStream);
        StreamWriter sw = new StreamWriter(toStream);
        sw.WriteLine(sr.ReadToEnd());
        sw.Flush();
    }
        catch (Exception ex)
        {
            string message = String.Format("CopyStream failed because: {0}", ex.Message);
            log.Error(message, ex);
        }
    }
}
[AttributeUsage(AttributeTargets.Method)]
public class SoapLoggerExtensionAttribute : SoapExtensionAttribute
{
    private int priority = 1; 

    public override int Priority
    {
        get { return priority; }
        set { priority = value; }
    }

    public override System.Type ExtensionType
    {
        get { return typeof (SoapLoggerExtension); }
    }
} 

然后,將以下部分添加到web.config中,其中YourNamespace和YourAssembly指向SoapExtension的類和程序集:

<webServices>
  <soapExtensionTypes>
    <add type="YourNamespace.SoapLoggerExtension, YourAssembly" 
       priority="1" group="0" />
  </soapExtensionTypes>
</webServices>

或者只是嘗試Fiddler 它可以讓您檢查請求和響應。 可能值得注意的是Fiddler可以同時處理HTTP和HTTP流量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM