6

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

http://abc.com/xyz/MyWebService 上没有可以接受消息的端点侦听。这通常是由不正确的地址或 SOAP 操作引起的。有关更多详细信息,请参阅 InnerException(如果存在)。 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>
4

4 回答 4

5

在我们的一个客户端连接我们的网络服务时,我为这个问题面临了将近 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>
于 2012-07-03T12:59:34.263 回答
2

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

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

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

wcf-http-407-proxy-authentication-required

于 2012-06-26T19:52:56.037 回答
0

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

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

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

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

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

于 2012-06-26T19:00:40.013 回答
0

只需将其添加到 web.config

<system.net>
    <defaultProxy enabled="true" useDefaultCredentials="true">
    </defaultProxy>
</system.net>
</configuration>
于 2018-04-03T10:56:30.000 回答