WCF 服务调用 returns“407 需要代理身份验证”
WCF service call returns '407 Proxy Authentication Required'
我正在托管一个 WCF 网络服务(在 Azure 上)并且已经将一个 WPF 桌面应用程序发送给一个客户(显然)尝试通过代理访问该服务。
服务调用失败,返回
The remote server returned an unexpected response: 407 Proxy
Authentication Required
客户端 app.config 文件的 ServiceModel
部分如下所示:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_ILicensing" closeTimeout="00:00:15" openTimeout="00:00:15"
receiveTimeout="00:00:15" sendTimeout="00:00:15" maxReceivedMessageSize="2147483647"
maxBufferSize="2147483647">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
maxArrayLength="2147483647" maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647"/>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="xxxxxxx"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ILicensing"
contract="Cloud.ILicensing" name="BasicHttpBinding_ILicensing" />
</client>
</system.serviceModel>
我知道的基本上就这些了。
我想通过修改 app.config 文件 and/or 服务的 web.config 文件来修复此行为(这应该无关紧要,因为服务未达到无论如何)。
据我了解,绑定节点的属性useDefaultWebProxy
要求查找系统代理配置并使用它来连接服务。但是,由于默认值为 true
,我希望将其显式设置为 true
不会改变任何内容(我猜这基本上是默认值的定义)。
代理身份验证失败的原因是什么,考虑到 useDefaultWebProxy
未设置,因此应该是 true
,因为它是默认值?
考虑到有限的信息,如何修改app.config以解决问题?基本上:know/ask 我的客户端需要什么(即代理服务器地址)以及我需要在客户端配置文件中的什么位置插入信息?
如何在我的本地机器上设置模拟该问题的测试环境?
对于 1 和 2,您需要配置 System.Net
为默认代理提供默认凭据 - 它不会' 默认情况下这样做(因为在自动访问互联网的应用程序中隐藏回调代码会很糟糕)。
<system.net>
<defaultProxy useDefaultCredentials="true" />
</system.net>
对于 3,我不完全确定你如何能够在本地测试它,因为你需要一台机器作为代理,这些通常是域控制器类型机器。您可以使用 2 个 VM 进行模拟,但我希望您拥有一台功能强大的机器来进行此操作,而且似乎需要付出很多努力才能对此进行测试。
您可以通过代码完成
WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;
我正在托管一个 WCF 网络服务(在 Azure 上)并且已经将一个 WPF 桌面应用程序发送给一个客户(显然)尝试通过代理访问该服务。
服务调用失败,返回
The remote server returned an unexpected response: 407 Proxy Authentication Required
客户端 app.config 文件的 ServiceModel
部分如下所示:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_ILicensing" closeTimeout="00:00:15" openTimeout="00:00:15"
receiveTimeout="00:00:15" sendTimeout="00:00:15" maxReceivedMessageSize="2147483647"
maxBufferSize="2147483647">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
maxArrayLength="2147483647" maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647"/>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="xxxxxxx"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ILicensing"
contract="Cloud.ILicensing" name="BasicHttpBinding_ILicensing" />
</client>
</system.serviceModel>
我知道的基本上就这些了。
我想通过修改 app.config 文件 and/or 服务的 web.config 文件来修复此行为(这应该无关紧要,因为服务未达到无论如何)。
据我了解,绑定节点的属性useDefaultWebProxy
要求查找系统代理配置并使用它来连接服务。但是,由于默认值为 true
,我希望将其显式设置为 true
不会改变任何内容(我猜这基本上是默认值的定义)。
代理身份验证失败的原因是什么,考虑到
useDefaultWebProxy
未设置,因此应该是true
,因为它是默认值?考虑到有限的信息,如何修改app.config以解决问题?基本上:know/ask 我的客户端需要什么(即代理服务器地址)以及我需要在客户端配置文件中的什么位置插入信息?
如何在我的本地机器上设置模拟该问题的测试环境?
对于 1 和 2,您需要配置 System.Net
为默认代理提供默认凭据 - 它不会' 默认情况下这样做(因为在自动访问互联网的应用程序中隐藏回调代码会很糟糕)。
<system.net>
<defaultProxy useDefaultCredentials="true" />
</system.net>
对于 3,我不完全确定你如何能够在本地测试它,因为你需要一台机器作为代理,这些通常是域控制器类型机器。您可以使用 2 个 VM 进行模拟,但我希望您拥有一台功能强大的机器来进行此操作,而且似乎需要付出很多努力才能对此进行测试。
您可以通过代码完成
WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;