2012-06-05 47 views
2

我有一个WCF服务和一个使用该服务的客户端。他们使用WSHttpBinding和MTOM消息编码。客户端不使用app.config文件,并执行代码中的所有端点配置。 它在正常的环境中都能很好地工作,但是现在有一些用户试图从http代理后面连接到服务。每当他们尝试连接时,他们都会得到一个407(需要代理身份验证)警告。通过http代理获取WSHttpBinding

我设法建立了自己的测试环境,使用虚拟机和连接到代理的专用网络,因此我可以模拟他们所看到的。 我已经尝试在app.config中设置system.net useDefaultCredentials属性,但这似乎没有任何效果。我检查了正在发送的数据包,并且它们不包含任何代理验证标头。通过代理查看网络流量,他们确实使用该标题。

我也尝试了将代理服务器硬编码到客户端,但这给出了“无法连接到服务器”异常。检查数据包,客户端发送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... 

回答

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

所以我仍然希望获得更多的帮助。

UPDATE: 我最终只是增加一个网络配置对话框,我的应用程序,使用户可以指定自己的代理服务器设置。我一直无法使自动代理设置正常工作。