在.NET中记录SOAP日志

4

我有一个内部企业应用程序,目前使用10个不同的Web服务。它们是通过旧式的“Web References”而不是使用WCF来消耗的。

我遇到的问题是尝试与公司中编写我正在使用的服务的其他团队合作。我发现我需要捕获我发送和接收的确切SOAP消息。我通过创建一个扩展SoapExtensionAttribute的新属性来实现这一点。然后,我只需将该属性添加到生成的Reference.cs文件中的服务方法中即可。这有效,但有两个痛点。首先,它是一个生成的文件,因此我在其中进行的任何操作都可能会被覆盖。其次,我必须记得在检入文件之前删除该属性。

是否有更好的方法来捕获我发送和接收的确切SOAP消息?

5个回答

4
这似乎是一个常见的问题,因为我刚刚提出了这个问题,并被告知要查看这里
您不必编辑生成的Reference.cs。您可以在应用程序的app.config中引用该扩展。

3

这是一个网络应用程序吗?

将您的 SoapExtension 代码放置在 HTTPModule 中,并将 SOAP 信封注入到 HTTPOutput 流中。

这样,在调试模式下,我想象页面顶部有一个可折叠的 div,列出该页面所有的 SOAP 通信。


2

我已经构建了一个HTTPModule来完成这个任务,我将删除我的公司特定信息并在今天晚些时候发布好处。

此外,请查看SoapUI,它是一个方便的工具。


1

您可以通过创建一个SoapExtention来实现这一点。请查看本文


0

我使用了以下代码作为一个例子,展示我如何在一段时间前编写的应用程序中捕获SOAP请求。

<System.Diagnostics.Conditional("DEBUG")> _
    Private Sub CheckHTTPRequest(ByVal functionName As String)
        Dim e As New UTF8Encoding()

        Dim bytes As Long = Me.Context.Request.InputStream.Length
        Dim stream(bytes) As Byte
        Me.Context.Request.InputStream.Seek(0, IO.SeekOrigin.Begin)
        Me.Context.Request.InputStream.Read(stream, 0, CInt(bytes))

        Dim thishttpRequest As String = e.GetString(stream)

        My.Computer.FileSystem.WriteAllText("D:\SoapRequests\" & functionName & ".xml", thishttpRequest, False)

    End Sub

像我所做的设置条件属性会使编译器忽略方法调用,除了调试之外的所有构建类型。

抱歉使用 VB,这是被强制要求的。


我没有看到我应该在哪里调用这个方法。 我还在那里看到了对HttpContext的引用。 我正在进行Web请求调用,而不是接收一个请求。 或者换句话说,我是在使用别人的Web服务。 他们要求我提供我发送给他们的确切SOAP以及从他们的服务返回给我的SOAP。 - Rob
啊,抱歉 Rob,我错误地认为你在处理 WebService 方面的工作。 - NotMyself

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接