-->

获得WsHttpBinding的工作通过HTTP代理(Getting WSHttpBinding w

2019-09-17 19:01发布

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

我已经成功使用虚拟机连接到代理服务器的专用网络,以建立自己的测试环境,所以我可以模仿他们所看到的东西。 我试过设置在app.config中的system.net useDefaultCredentials财产,但似乎没有任何效果。 我已经研究正在发送的数据包,并且不包含任何代理认证头。 通过代理纵观网络流量,他们使用该头。

我也试着硬编码的代理服务器到客户端,而是提供了一个“无法连接到服务器”异常。 检查数据包,客户端发送了3周小的的代理,其中没有一个是HTTP请求,仅此而已。 我不知道它在做什么在那里。

我还跟竟然消息检查添加到客户端,并手动注入所需的头到请求,但没有显示在页眉起来。

我在这里打我的绳子结束,我真的需要一个解决方案。 对我缺少的是什么在这里的任何想法或解决方案?

这( WCF服务具有的wsHttpBinding -操纵HTTP请求头 )很有前途,但我仍然坚持。

编辑:这里是代码的一部分。

            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...

Answer 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服务的证书,但对于链式证书的请求不使用代理服务器设置。 由于这是一个更具体的问题,我写它分开这里: 证书验证不为chaintrust使用代理服务器设置

所以我还是希望更多的帮助。

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



文章来源: Getting WSHttpBinding working through an http proxy