【问题标题】:WCF service call returns '407 Proxy Authentication Required'WCF 服务调用返回“需要 407 代理身份验证”
【发布时间】:2015-02-17 13:22:05
【问题描述】:

我正在托管 WCF Web 服务(在 Azure 上),并已将 WPF 桌面应用程序发送给(显然)尝试通过代理访问服务的客户端。

服务调用失败,返回

远程服务器返回意外响应:407 代理 需要身份验证

客户端 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 文件和/或 web.config 文件来解决此问题(这无关紧要,因为无论如何都无法访问该服务)。

据我了解,绑定节点有useDefaultWebProxy属性,它要求查找系统代理配置,并使用它来连接服务。但是,由于默认值为 true,我希望将其显式设置为 true 不会改变任何内容(我猜这基本上是默认值的定义)。

  1. 考虑到useDefaultWebProxy 未设置,因此由于它的默认值应该是true,代理身份验证失败的原因是什么?

  2. 如何修改 app.config 以解决考虑到信息有限的问题?基本上:我需要知道/询问我的客户什么(即代理服务器地址)以及我需要在我的客户配置文件中的什么位置插入信息?

  3. 如何在我的本地机器上设置一个模拟问题的测试环境?

【问题讨论】:

    标签: c# wcf azure proxy


    【解决方案1】:

    对于 12,您需要配置 System.Net 为默认代理提供默认凭据 - 默认情况下不这样做(因为隐藏回调自动访问互联网的应用程序中的代码会很糟糕)。

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

    对于3,我不完全确定您将如何在本地进行测试,因为您需要一台机器充当代理并且这些机器通常是域控制器类型的机器。您可以使用 2 个虚拟机进行模拟,但我希望您有一台功能强大的机器来进行此操作,而且测试这一点似乎需要付出很多努力。

    【讨论】:

    • 非常感谢,这正是我所希望的答案,因为它很容易修复,并且可以清楚地解释问题所在!我会尝试并肯定会让你知道它是否有效。对于3,也非常感谢你,虽然我希望那时我不需要这个。
    • 没问题。 :) 如果它解决了您的问题,请记住将其标记为答案。
    • 嗨 toadflakz。客户用您建议的修复程序替换了配置,它可以正常工作。干得好,非常感谢,这真的很有帮助!
    【解决方案2】:

    你可以通过代码来实现

    WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;
    

    【讨论】:

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