【发布时间】: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 响应。
-
您应该使用您的方法发布答案。这是一个很棒的答案。