Как я могу установить HTTP-прокси (WebProxy) на прокси-сервер службы WCF на стороне клиента?
Вопрос
Как я могу установить 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
;в противном случае ваш прокси-сервер будет проигнорирован.