【问题标题】:See Raw Response to a WCF Call请参阅对 WCF 调用的原始响应
【发布时间】:2013-11-26 18:28:30
【问题描述】:

我正在构建一个与 SOAP Web 服务集成的简单 C# 应用程序。我将服务引用添加到适当的 WSDL,到目前为止一切正常。

有时,服务器的防火墙会在请求有机会访问 Web 服务之前响应 503 错误。该 503 错误还包含一些我想要捕获的带有 ID 号(每次都会更改)的 HTML。

如果我捕捉到异常,它不会给我完整的消息 - 只是重新格式化的基本异常表明服务器太忙了。

我尝试了这篇帖子中的消息检查员建议: Intercept SOAP messages from and to a web service at the client

...它给了我出站请求,但它从未命中 AfterReceiveReply 调用,因此未捕获响应。

我还尝试订阅频道的所有主要事件(Faulted、Opening、Opened、UnknownMessageReceived 等),并尝试在发现异常时检查频道,但似乎没有任何效果。

有什么想法或建议吗?

【问题讨论】:

    标签: c# wcf exception soap message


    【解决方案1】:

    为什么不直接在运行您的 soap 客户端的机器上运行 fiddler 并以这种方式拦截和检查流量?

    【讨论】:

    • 我今天正在这样做,但是这个应用程序将被其他无法运行 Fiddler 的非技术人员使用。我需要应用程序能够处理这个问题。
    • 根据我的经验,让人们在故障排除期间安装和运行 fiddler 并不是特别困难。此外,在按摩数据后使用 fiddler 重放可以加快故障排除速度。
    • 在这种特殊情况下,关键是在错误发生时以编程方式捕获 ID 并将其记录在某处。我很欣赏使用 Fiddler 的建议,但这并不是针对这种特定情况的正确答案。我需要 .NET 应用程序能够看到 503 错误消息的原始内容,以便应用程序能够自动正确地处理它。
    【解决方案2】:

    打开WCF Tracing。特别是消息记录。

    【讨论】:

    • 我试图弄清楚如何通过运行时代码而不是通过 .config 文件启用消息日志记录。这个应用程序最终成为一个更大应用程序的插件,并且在安装和分发时,只有 DLL 会消失。我在运行时定义了一个新的端点、绑定(BasicHttpBinding)和客户端。现在我正在尝试将事情拼凑起来,但任何帮助都会非常受欢迎。谢谢!
    • 我出于测试目的在配置文件中打开了日志记录,但我没有看到 503 错误的实际原始内容:<ExceptionString>System.ServiceModel.ServerTooBusyException: The HTTP service located at https://<site>/503.php is unavailable. This could be because the service is too busy or because no endpoint was found listening at the specified address. Please ensure that the address is correct and try accessing the service again later. ---> System.Net.WebException: The remote server returned an error: (503) Server Unavailable. at System.Net.HttpWebRequest.GetResponse()
    【解决方案3】:
    1. 似乎在 .config 文件中禁用 SOAPProcessing 可能是朝这个方向迈出的一步,但我无法弄清楚如何通过代码启用此设置(而且我无法在我的最终版本中使用 .config 文件应用程序,因为这是一个插件,并且每次启动都会动态生成父应用程序的 .config 文件)。

    2. 我能够在某种程度上解决这个问题。在我的情况下,我有单独的开发和生产服务器。 503s 错误主要发生在生产服务器上(可能是由于防火墙对 API 请求中的不同主机名敏感),所以我最终找到了一个复制 API 请求并将它们发送到生产服务器的解决方案。

    (这没关系,因为生产服务器没有配置任何会受到通过防火墙的任何 API 请求影响的任何内容。这些请求将被视为无效。)

    我通过使用消息检查器生成最后一个传出请求来做到这一点。然后对于每个传出请求,我生成一个新的 WebBrowser 控件,设置正确的标头(SOAPAction 等),重新注入安全凭据(消息检查器在运行时将它们剥离),然后将请求发布到生产服务器使用该 WebBrowser 控件。 WebBrowser 实例的 DocumentCompleted 事件让我可以转储结果并在适当的时候搜索票证 ID。

    不是很迷人,但效果很好。

    【讨论】:

      猜你喜欢
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      相关资源
      最近更新 更多