我有一个WCF服务和一个使用该服务的客户端。他们使用WSHttpBinding和MTOM消息编码。客户端不使用app.config文件,并在代码中执行所有端点配置。 它在普通环境中运行得相当不错,但是我现在有一些用户试图从http代理后面连接到服务。每当他们尝试连接时,他们都会收到407(需要代理身份验证)警告。
我已经设法使用具有连接到代理的专用网络的虚拟机来设置我自己的测试环境,因此我可以模拟他们看到的内容。 我已经尝试在app.config中设置system.net useDefaultCredentials属性,但这似乎没有任何效果。我检查了正在发送的数据包,它们不包含任何代理身份验证标头。通过代理查看Web流量,他们确实使用了该标头。
我也尝试将代理服务器硬编码到客户端,但这会产生“无法连接到服务器”的异常。检查数据包,客户端向代理发送3个小数据包,其中没有一个是http请求,就是这样。我不确定它在做什么。
我甚至为客户端添加了一个消息检查器,并手动将所需的头部注入到请求中,但是没有显示在头部中。
我在这里结束了绳索,我真的需要一个解决方案。关于我在这里缺少什么或解决方案的任何想法?
这(WCF Service with wsHttpBinding - Manipulating HTTP request headers)看起来很有希望,但我仍然陷入困境。
编辑: 这是代码的一部分。
var binding = new WSHttpBinding();
binding.MaxReceivedMessageSize = 100000000;
binding.MessageEncoding = WSMessageEncoding.Mtom;
binding.ReaderQuotas.MaxArrayLength = 100000000;
binding.OpenTimeout = new TimeSpan(0, 2, 0);
binding.ReceiveTimeout = new TimeSpan(0, 2, 0);
binding.SendTimeout = new TimeSpan(0, 2, 0);
binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
binding.UseDefaultWebProxy = true;
// I've also tried setting this to false, and manually specifying the binding.ProxyAddress
binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.Basic;
var endpointAddress = new EndpointAddress(new Uri(hostUrl));
clientProxy_ = new UpdaterServiceProxy(binding, endpointAddress);
// this behavior was the attempt to manually add the Proxy-Authentication header
//clientProxy_.Endpoint.Behaviors.Add(new MyEndpointBehavior());
clientProxy_.ClientCredentials.UserName.UserName = userName;
clientProxy_.ClientCredentials.UserName.Password = password;
clientProxy_.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode =
System.ServiceModel.Security.X509CertificateValidationMode.ChainTrust;
// do stuff...
答案 0 :(得分:1)
经过大量的实验,我取得了一些进展。事实证明,我可以手动指定代理,它将起作用。
WebProxy proxy = new WebProxy("http://x.x.x.x:3128", false);
proxy.Credentials = new NetworkCredential("user", "pass");
WebRequest.DefaultWebProxy = proxy;
该代码出现在我实例化clientProxy_之前。我曾经尝试过这个,但它没有指定端口,它默默地失败了。我仍然无法获取它来获取Windows Internet设置中指定的代理设置。我尝试设置proxy.Credentials = CredentialCache.DefaultNetworkCredentials;
,但似乎也没有效果。
我现在也遇到问题,客户端尝试使用ChainTrust验证服务的证书,但是链式证书的请求没有使用代理设置。由于这是一个更具体的问题,我在此单独编写:Certificate validation doesn't use proxy settings for chaintrust
所以我仍然希望得到更多的帮助。
<强>更新强>: 我最后只是在我的应用程序中添加了一个网络配置对话框,以便用户可以指定他们的代理设置。我无法让自动代理设置正常工作。