【问题标题】:How to set proxy credentials to specific wcf client?如何为特定的 wcf 客户端设置代理凭据?
【发布时间】:2013-07-31 20:32:54
【问题描述】:

我需要连接到一些公共 wcf 服务,但我和服务之间有一些代理。 如果我使用默认代理设置,例如

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

HttpWebRequest.DefaultWebProxy

它工作得很好 但我不需要为整个应用程序设置代理设置,我需要为特定连接设置它。那我该怎么做呢?

我看到了 ProxyAddress 属性

(client.Endpoint.Binding as BasicHttpBinding).ProxyAddress

但是凭据没有任何属性... 我在想以某种方式修改HttpWebRequest,但我不知道如何得到它......

已解决

谢谢大家的回答。

AntonK 的答案适合解决我的问题。

实际遇到这个问题的时候,我也是用同样的方法解决的,只是没有使用web.config,而是写了这个方法

void SetProxySettings<TChannel>(ClientBase<TChannel> client, 
    bool useProxy, string address, int port, string login, string password) 
    where TChannel : class
{
    if (!useProxy) return;
    var b = client.Endpoint.Binding as BasicHttpBinding;
    if (b == null)
    {
        System.Diagnostics.Debug.WriteLine("Binding of this endpoint is not BasicHttpBinding");
        return;
    }
    b.ProxyAddress = new Uri(string.Format("http://{0}:{1}", address, port));
    b.UseDefaultWebProxy = false; // !!!
    b.Security.Mode = BasicHttpSecurityMode.Transport;
    b.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; // !!!
    b.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.Basic; // !!!
    if (client.ClientCredentials == null) return;
    client.ClientCredentials.UserName.UserName = login;
    client.ClientCredentials.UserName.Password = password;
}

【问题讨论】:

  • 发回解决方案太棒了!如果我能 5 你。
  • 如果传输是 HTTP 而不是 HTTPS,则 BasicHttpSecurityMode.Transport 不起作用,但 BasicHttpSecurityMode.TransportCredentialOnly 起作用。但是,对于每个 Web 服务调用,都会生成两个请求:第一个请求在没有 Proxy-Authorization 标头的情况下发送,并被代理以“407 Proxy Auth Required”拒绝,第二个包含标头并通过。我想知道是否有一种方法可以立即发送 Proxy-Authorization 标头而无需等待 407 响应。
  • 您应该使用您的方法发布答案。这是一个很棒的答案。

标签: c# wcf proxy


【解决方案1】:

这是一篇处理此问题的文章。

http://blogs.msdn.com/b/stcheng/archive/2008/12/03/wcf-how-to-supply-dedicated-credentials-for-webproxy-authentication.aspx

总而言之,这就是如何在 web.config 中为特定服务设置代理。在绑定配置中,设置 proxyAddress="http://myproxy:8080" 并设置 useDefaultWebProxy="false"

<bindings>
  <basicHttpBinding>
     <binding name="SubscriberFulfilmentServiceSOAP12Binding" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:01:00" sendTimeout="00:01:00"
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
      maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"
      textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="false"
proxyAddress="http://myproxy:8080"
      messageEncoding="Text">
      <readerQuotas maxDepth="32" maxStringContentLength="2147483647"
        maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None"
          realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

【讨论】:

  • 我不明白这是如何回答这个问题的。没有提供代理凭据。
【解决方案2】:

我找到了解决方案。您必须将 WCF 更新到最新版本。

进入 NuGet 包管理器 -> 更新 WCF 的所有相关项目 URL 必须有:

System.ServiceModel.Security
System.ServiceModel.NetTcp
System.ServiceModel.Http

这适用于 .net core 2.1 版本。

【讨论】:

    【解决方案3】:

    你可以试试这个

    HttpWebRequest request = HttpWebRequest.Create("URI") as HttpWebRequest;
    var proxy = new WebProxy(HttpWebRequest.GetSystemWebProxy().GetProxy(request.RequestUri), true);
    proxy.Credentials = new NetworkCredential(proxyUserName, proxyPassword, DomainName);
    request.Proxy = proxy;
    

    希望对你有帮助

    【讨论】:

    • 在哪里可以获得 wcf-service 客户端实例的请求?
    • 使用 wcf url 同时创建请求 HttpWebRequest request = HttpWebRequest.Create("localhost:8080/myservice/getdescription") as HttpWebRequest;
    • 好的,可以在 wsdl 描述中找到链接,并且它可以工作...那么,您是否建议手动生成 Soap 请求然后解析响应?
    • 这几乎与我的需求相同。我有一个工作的 WCF 服务,它也通过代理工作(默认情况下)。但是,现在我将我的 HTTP 代理更改为需要用户名/密码。我应该能够以编程方式输入这些。如何从对我的服务的引用开始设置它? MyServ s = new MyServ();在这里看不到答案。
    • 找到此链接,stackoverflow.com/questions/951523/…。这篇文章帮助我了解了我需要参考哪个类。
    猜你喜欢
    • 2017-03-22
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    相关资源
    最近更新 更多