通过http代理使WSHttpBinding工作

3
我有一个使用WSHttpBinding和MTOM消息编码的WCF服务和客户端。客户端没有使用app.config文件,在代码中完成了所有终结点配置。在正常环境下,一切都很好,但现在有些用户试图从http代理后面连接到该服务。每当他们尝试连接时,就会收到407(需要代理身份验证)警告。
我已经设置了app.config中的system.net useDefaultCredentials属性,但似乎没有任何效果。我检查了发送的数据包,发现它们不包含任何Proxy-Authentication头。通过代理查看网络流量,可以看到它们确实使用了该头部。
我还尝试将代理服务器硬编码到客户端中,但这会引发“无法连接到服务器”的异常。检查数据包,客户端向代理发送了三个小数据包,其中没有一个是http请求。我不确定它在那里做什么。
我甚至添加了一个消息检查器到客户端,并手动将所需的标头注入请求中,但这并没有显示在标头中。
我已经快要崩溃了,我真的需要一个解决方案。你有什么想法吗?我可能错过了什么,或者有解决方法吗?
这个(带有wsHttpBinding的WCF服务-操作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...
1个回答

2
经过许多实验,我取得了一些进展。事实证明,我可以手动指定代理,并且它会起作用。
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验证服务的证书,但是链式证书的请求没有使用代理设置。由于这是一个更具体的问题,我单独写了一篇文章:证书验证不使用链式信任的代理设置

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

更新: 最后我只是在我的应用程序中添加了一个网络配置对话框,让用户可以指定他们的代理设置。我一直无法使自动代理设置正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接