【问题标题】:Log soap request and response for non .Net SOAP web services记录非 .Net SOAP Web 服务的 soap 请求和响应
【发布时间】:2015-03-11 02:41:19
【问题描述】:

我在我的 .net 应用程序中使用的不是 .Net SOAP Web 服务(ESB 服务)。我添加了参考或使用添加网络参考的服务。

现在,当我调用此服务的任何方法时,我想记录soap 请求和响应。我想将请求/响应存储在数据库中。

谁能告诉我如何在c#中记录.Net SOAP Web服务的soap请求和响应?

【问题讨论】:

  • 如果可能的话,您应该改用“添加服务参考”。这样,您就可以使用 WCF 的内置跟踪功能。
  • 但是该服务不是 WCF 服务
  • 不管它是什么样的服务。您可以对基于 Java 的服务执行相同的操作。

标签: c# .net soap esb


【解决方案1】:

此代码来自this帖子,写的任何代码都不是我的^^

您可以实现将完整请求和响应记录到日志文件的 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 和 https 流量。

【讨论】:

  • 我已经在我的 web.config 中添加了这段代码。当我调用我的方法时,trace.log 没有被创建并且我无法看到请求响应。
  • @Rahul - 您可以通过调整上面示例中的 initializeData 属性的值来设置 trace.log 文件的路径。 ——
  • 我可以在 bin/debug 文件夹的 trace.log 中看到响应和请求标签,但它不正确。我不能简单地复制它并运行到soap ui。有没有其他方法可以在数据库中请求/响应。
猜你喜欢
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多