【问题标题】:Proxy authentication required error when using a webservice使用 Web 服务时需要代理身份验证错误
【发布时间】:2012-06-25 22:29:40
【问题描述】:

我有一个在 Windows 7 和 Windows XP 上运行的 .Net 4.0 Windows 应用程序。 应用程序中的一个模块使用他们的网络服务连接到互联网上的一个 url [比如 http://abc.com/xyz/MyWebService]。这个功能一直有效,直到上周我开始收到此错误消息时在 Web 服务上调用方法

http://abc.com/xyz/MyWebService 没有端点监听 可以接受该消息。这通常是由不正确的 地址或 SOAP 操作。有关更多信息,请参阅 InnerException(如果存在) details.And InnerException 是:HTTP Error 407 Proxy authentication required

我多次[在 Windows 7 上] 重新运行此代码,我发现此行为是随机的...即。有时能够在服务器上调用 webservice 方法而不会出现任何错误。

不确定幕后发生了什么以及什么可以解释这种随机行为。 此外,该错误不会出现在安装了 Windows XP 且位于公司 Intranet 上不同地理位置的计算机上。

有什么想法吗?

注意:当我在 app.config 中添加以下节点时,错误似乎已经消失:

<system.net>
    <defaultProxy enabled="true" useDefaultCredentials="true">
    </defaultProxy>
</system.net>

【问题讨论】:

  • 您是否检查过 Win7 防火墙以确保应用程序未被阻止?或检查任何可能阻止它的 AV 软件。您对&lt;defaultProxy&gt; 所做的基本上是告诉应用程序将用户凭据传递给某种网络代理(通常通过控制面板中的“Internet 选项”进行配置。

标签: c# wcf web-services proxy web


【解决方案1】:

从提供的信息来看,运行此代码的 Windows XP 机器似乎属于以下类别之一:

  • 不使用代理
  • 此位置的代理不需要身份验证(使用默认帐户)

这对于不会投资多个代理并且不希望通过主园区路由所有流量的额外延迟的小型公司来说很常见。

听起来 Windows 7 位置使用了需要身份验证的代理。正如Coding Gorilla 指出的那样,您的代理设置已经在控制面板的“Internet 选项”下进行了配置。

要验证这一点,您可以检查 XP 机器上的“Internet 选项”,看看它是否配置了代理。

【讨论】:

    【解决方案2】:

    我认为这与您的 WCF 服务无关。

    这是因为如果您坐在 ISA 服务器或其他东西后面,则会更改防火墙的配置

    查看下面的链接以获得进一步的说明

    wcf-http-407-proxy-authentication-required

    【讨论】:

      【解决方案3】:

      在我们的一个客户端连接我们的网络服务时,我为此问题遭受了将近 2 周的痛苦。

      您需要使用实现 IWebProxy 的自定义代理模块覆盖 System.Net 配置

      第 1 步:创建程序集 (DLL) 第 2 步:向其中添加以下类

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Net;
      using System.Configuration;
      
      namespace MyProjectNameSpace.Utils.WebProxy
      {
          public class CustomWebProxy : IWebProxy
          {
              public ICredentials Credentials
              {
                  get
                  {
                      string _proxyUserName  = ConfigurationManager.AppSettings["ProxyUserName" ] as string ?? "";
                      string _proxyPassword  = ConfigurationManager.AppSettings["ProxyPassword" ] as string ?? "";
                      string _useProxyDomain = ConfigurationManager.AppSettings["UseProxyDomain"] as string ?? "";
                      string _proxyDomain    = ConfigurationManager.AppSettings["ProxyDomain"   ] as string ?? "";
      
                      return String.IsNullOrEmpty(_proxyDomain)
                          ? new NetworkCredential(_proxyUserName, _proxyPassword)
                          : new NetworkCredential(_proxyUserName, _proxyPassword, _proxyDomain);
                  }
                  set { }
              }
      
              public Uri GetProxy(Uri destination)
              {
                  string _proxyServer = ConfigurationManager.AppSettings["ProxyServer"] as string ?? "";
                  Uri result = new Uri(_proxyServer);
                  return result;
              }
      
              public bool IsBypassed(Uri host)
              {
                  return false;
              }
          }
      }
      

      第 3 步:编译到发布模式 第 4 步:将 DLL 引用到您的 WCF 客户端项目 第 5 步:打开 WCF 客户端项目的 Web.Config 或 App.Config 文件并添加以下配置。

      <appSettings>
              <add key="ProxyServer" value="http://192.168.1.254:9099"/>
              <add key="ProxyUserName" value="dipak.r"/>
              <add key="ProxyPassword" value="password"/>
              <add key="UseProxyDomain" value="true"/>
              <add key="ProxyDomain" value="DOMAINNAME"/>
      </appSettings>
      

      添加或更改以下部分。

      <system.net>
          <defaultProxy enabled="true" useDefaultCredentials="false">
            <module type="MyProjectNameSpace.Utils.WebProxy.CustomWebProxy, MyProjectNameSpace.Utils.WebProxy"/>
          </defaultProxy>
      </system.net>
      

      【讨论】:

      • 您可以创建一个配置屏幕来打开或关闭该功能,即通过修改 IWebProxy 类并将某些 AppSettings 设置为 true false 来通过代理访问网络。
      【解决方案4】:

      只需在 web.config 中添加它

      <system.net>
          <defaultProxy enabled="true" useDefaultCredentials="true">
          </defaultProxy>
      </system.net>
      </configuration>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-02
        相关资源
        最近更新 更多