2012-06-05 2 views
2

У меня есть служба WCF и клиент, который использует эту службу. Они используют WSHttpBinding с кодировкой сообщений MTOM. Клиент не использует файл app.config и выполняет всю конфигурацию конечной точки в коде. Все работает довольно хорошо в обычной среде, однако теперь у меня есть некоторые пользователи, которые пытаются подключиться к службе из-за http-прокси. Всякий раз, когда они пытаются подключиться, они получают предупреждение 407 (требование прокси-аутентификации).Получение WSHttpBinding, работающего через HTTP-прокси

Мне удалось настроить собственную среду тестирования с помощью виртуальной машины с частной сетью, которая соединяется с прокси-сервером, поэтому я смогу имитировать то, что они видят. Я попытался установить свойство system.net useDefaultCredentials в app.config, но это, похоже, не имеет никакого эффекта. Я рассмотрел отправленные пакеты и не содержит заголовков прокси-аутентификации. Рассматривая веб-трафик через прокси-сервер, они используют этот заголовок.

Я также пытался жестко кодировать прокси-сервер в клиенте, но это дает исключение «не может подключиться к серверу». Рассматривая пакеты, клиент отправляет 3 небольших прокси-сервера, ни один из которых не является HTTP-запросом, и все. Я не уверен, что он там делает.

Я даже зашел так далеко, чтобы добавить к клиенту инспектор сообщений и вручную ввести требуемый заголовок в запросы, но это не отображается в заголовке.

Я нахожусь в конце моей веревки здесь, и мне действительно нужно решение. Любые идеи о том, что мне здесь не хватает, или решение?

Это (WCF Service with wsHttpBinding - Manipulating HTTP request headers) кажется многообещающим, но я все еще застрял.

EDIT: Вот часть кода.

  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; 

Этот код появляется непосредственно перед тем, как создать экземпляр моего клиентаProxy_. Я пробовал это раньше, но он молчал, потому что я не указал порт. Я все еще не могу заставить его забрать настройки прокси, указанные в настройках Windows Internet. Я попробовал установить proxy.Credentials = CredentialCache.DefaultNetworkCredentials;, но это также не имело никакого эффекта.

У меня также возникает проблема с клиентом, пытающимся проверить сертификат службы с помощью ChainTrust, но запросы для связанных цепочек не используют настройки прокси-сервера. Поскольку это более конкретный вопрос, я написал его отдельно здесь: Certificate validation doesn't use proxy settings for chaintrust

Так что я все еще надеюсь получить дополнительную помощь.

UPDATE: В результате я просто добавил диалог конфигурации сети в мое приложение, чтобы пользователь мог указать свои настройки прокси. Я не смог настроить параметры автоматического прокси-сервера для правильной работы.