Как я могу установить HTTP-прокси (WebProxy) на прокси-сервер службы WCF на стороне клиента?

StackOverflow https://stackoverflow.com/questions/951523

  •  11-09-2019
  •  | 
  •  

Вопрос

Как я могу установить HTTP-прокси программно, на клиенте WCF, без использования прокси по умолчанию?

Прокси, прокси, прокси-серверы.

В соответствии с моделью разработки WCF я создаю "прокси" на стороне клиента классы, запуская svcutil.exe в WSDL для службы.(Это также создает конфигурационный файл на стороне клиента).

В моем коде я создаю новый экземпляр этого класса, и я могу подключиться к сервису .Очень мило.

var svcProxy = new MyWebService();
svcProxy.GetInformation(request); 

Мы называем эту штуку прокси-классом, но есть и другой прокси - http-прокси.Этот сервис использует wsHttpBinding BasicHttpBinding, поэтому он работает через http.Теперь предположим, что я хочу подключить клиента к веб-службе через http-прокси (смоделированный System.Net.WebProxy в .NET BCL).Я знаю из моего обширного, восхитительный опыт чтения .Чистая и документации WCF, что среда выполнения WCF, если не указано иное, будет использоваться по умолчанию прокси-системы при обмене данными по протоколу HTTP или https.

Я могу установить это из командной строки в WinXP / 2003 с помощью ProxyCfg.exe как описано здесь, и в более поздних версиях Windows с помощью netsh.exe как описано здесь.

Я также могу указать веб-прокси по умолчанию для использования в приложении установив System.Net.WebRequest.Свойство DefaultWebProxy по умолчанию.

Но предположим, я хочу подключиться через прокси, который отличается от общесистемного прокси-сервера ?Например, может быть, нет общесистемного прокси-сервера, но Мне нужно использовать его, в частности, для веб-службы.Или, может быть, есть общесистемный прокси-сервер, но мне нужно использовать другой, для веб-сервиса .И на самом деле, возможно, существует несколько клиентов веб-службы, и у каждого из них должен быть свой прокси.

Как можно настроить привязку прокси-сервера к каждому?

В модели ASMX я мог бы сделать это:

var svcProxy = new MyWebService();
svcProxy.Proxy = new System.Net.WebProxy("http://proxyserver:1234", true);
svcProxy.GetInformation(request); 

Но это невозможно с WCF;прокси-сервер, созданный WCF на стороне клиента классы не предоставляют свойство прокси-сервера.Как мне настроить http-прокси для каждого клиентского прокси-сервера, а также как мне настроить аутентификацию на http-прокси?

Похожие:
- как настроить прокси-сервер с учетными данными на сгенерированный wcf-клиент

Это было полезно?

Решение

Настройки прокси-сервера являются частью конфигурации привязки.Например, посмотрите на Проксиаддресс свойство Базовая привязка HttpBinding и Привязка wsHttpBinding классы / элементы конфигурации.

Похоже, вы оставляете конфигурацию своей конечной точки в файле app.config, и в этом случае вы должны иметь возможность установить адрес там.

Другие советы

Имеет смысл, что у прокси-сервера WCF нет свойства Proxy, потому что не все прокси-серверы WCF используют HTTP для связи.После дальнейшего рассмотрения я обнаружил, что можно установить прокси-сервер в WCF программно, если прокси-сервер WCF использует привязку HTTP.Я документирую это здесь на случай, если это понадобится кому-то еще.Чтобы установить HTTP-прокси в коде для клиента WCF, сделайте это:

// instantiate a proxy for the service
var svc= new ServiceClient();
// get the HTTP binding
var b = svc.Endpoint.Binding as System.ServiceModel.BasicHttpBinding;
b.ProxyAddress = new Uri("http://127.0.0.1:8888");
b.BypassProxyOnLocal = false;
b.UseDefaultWebProxy = false;

И чтобы задать адрес конечной точки - где связаться с сервером - в коде, вы бы сделали что-то вроде этого:

var e = svc.Endpoint;
e.Address = new System.ServiceModel.EndpointAddress(
    "http://remoteserver:5555/WcfXmlElement");

У меня была похожая проблема, но мне также нужно было использовать имя пользователя и пароль для прокси, которые отличаются от имени пользователя и пароля, используемых для доступа к сервису.

Я попытался создать его с помощью UriBuilder , который выводил бы адрес прокси как "http://username:password@myproxyserver/".К сожалению, конкретный прокси-сервер, который я использовал, не работал с этой техникой.

Что я нашел после тщательного поиска в Google, так это то, что вы можете изменить прокси через WebRequest.DefaultProxy (статическое свойство).

Например:

WebProxy proxy = new WebProxy("http://myproxyserver",true);
proxy.Credentials = new NetworkCredential("username", "password");
WebRequest.DefaultWebProxy = proxy;

Вы также могли бы попробовать это :

Программно получите любую привязку, которую вы используете, а затем установите прокси для нее напрямую, например

var binding = new WSDualHttpBinding("WSDualHttpBinding_IMainService");
binding.ProxyAddress = new Uri("http://192.168.5.1:3128");

где "WSDualHttpBinding_IMainService" это имя вашей привязки из вашего конфигурационного файла.Также вы должны установить UseDefaultWebProxy=false;в противном случае ваш прокси-сервер будет проигнорирован.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top