使用Web服务时,代理身份验证需要出错

时间:2012-06-24 09:14:44

标签: c# wcf web-services proxy web

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

  

http://abc.com/xyz/MyWebService没有收听端点   那可以接受这个消息。这通常是由不正确引起的   地址或SOAP操作。有关更多信息,请参阅InnerException(如果存在)   details.And InnerException是:HTTP错误407需要代理身份验证

我多次重新运行[在Windows 7上]这个代码,我发现这个行为是随机的... ie.sometimes能够在服务器上调用webservice方法而没有任何错误。

不确定幕后会发生什么,以及可以解释这种随机行为的原因。 此外,此错误不会出现在Windows XP上的公司内部网络上位于不同地理位置的计算机上。

有什么想法吗?

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

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

4 个答案:

答案 0 :(得分:5)

在我们的一个客户端连接我们的网络服务时,我遇到了近两周的痛苦。

您需要使用实现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>

答案 1 :(得分:3)

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

这是因为如果你坐在ISA服务器后面或者什么地方改变了防火墙的配置

请查看以下链接以获得更进一步的澄清

wcf-http-407-proxy-authentication-required

答案 2 :(得分:0)

从提供的信息来看,听起来好像这个代码适用的Windows XP机器属于以下类别之一:

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

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

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

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

答案 3 :(得分:0)

只需在web.config

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