【问题标题】:How do I get the URI that threw a WebException?如何获取引发 WebException 的 URI?
【发布时间】:2010-12-23 20:11:17
【问题描述】:

我在 web 服务上调用一个方法,它抛出 403 Forbidden WebException...

System.Net.WebException:请求 HTTP 状态 403 失败: 禁止。

我已经记录了这个错误,但我真的很想在日志消息中记录 URI,以便轻松确定是哪个 Web 服务导致了问题。

有没有一种简单的方法可以从抛出的 WebException 中获取 URI?我查看了属性列表,但没有看到任何可以满足我想要的东西。

【问题讨论】:

  • 您不应该使用 URI 来拨打电话吗?
  • 我的方法使用了两个可以抛出 WebException 的 web 服务......因此,我想从异常中访问 URI......
  • 那么您是在自己的网络服务中调用 2 个网络服务方法吗?
  • 我有一个使用两个网络服务的应用程序...
  • 只需用 try..catch 包装它们并抛出您自己的自定义异常,其中包含 Url 详细信息。

标签: c# .net web-services uri system.net.webexception


【解决方案1】:

您可以访问 SOAP 客户端代理对象(SoapHttpClientProtocol 类型)上的 Url 属性。

如果您从代码中的一个方法调用两个不同的 Web 服务,只需在 Web 服务调用周围放置一个 try {} 捕获,并使用有问题的 Web 服务的 Url 属性抛出一个适当的自定义 Exception

类似:

string url = client.Url;
try
{
  client.MyWebServiceCall();
  url = client2.Url;
  client2.MyWebServiceCall2();
}
catch (Exception ex)
{
  throw new Exception("Webservice call failed. Url: "+url+", Error:"+ex.Message,ex);
}

【讨论】:

  • 我将这个标记为答案,因为我没有意识到 web 服务可以访问 Url 属性......并且因为我的代码有一个围绕 web 服务的包装器,它没有复制网址我无法访问它。我已经更改了代码以在包装的 web 服务上提供 Url,并确保我的 try-catch 仅围绕一个服务调用。
【解决方案2】:

请确保您没有通过需要身份验证的网络代理调用服务。你会得到这个(或者可能是 401)错误并拉出你的头发(就像我一样)试图找出故障发生在哪里。直到我进行网络跟踪并发现请求正在访问我们的出站身份验证代理,并且请求没有凭据并被弹回,我才意识到发生了什么。

【讨论】:

    【解决方案3】:

    这对我来说可以直接从 WebException 中检索 Uri:

    Uri uri = wex.Response.ResponseUri;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-10
      • 1970-01-01
      • 2011-03-02
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      • 2019-10-16
      • 1970-01-01
      相关资源
      最近更新 更多