Как установить 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). я знаю
из моего обширного, восхитительного опыта чтения документации .NET и 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 клиентский прокси-сервер
классы не выставляют свойство Proxy. Как установить прокси-сервер http, на прокси-сервер на стороне клиента и как установить аутентификацию на прокси-сервере http?
по теме:
- how-to-set-proxy-with-credentials-to-generated-wcf-client
Ответы
Ответ 1
Параметры прокси-сервера являются частью конфигурации привязки. Например, посмотрите ProxyAddress свойство BasicHTTPBinding и классы/элементы конфигурации WSHttpBinding.
Похоже, что вы оставляете конфигурацию конечной точки в файле app.config, и в этом случае вы должны установить там адрес.
Ответ 2
Имеет смысл, что в прокси-сервере 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");
Ответ 3
У меня была аналогичная проблема, но мне также нужно было использовать имя пользователя и пароль для прокси, которые отличаются от имени пользователя и пароля, используемых для доступа к службе.
Я попытался создать его через UriBuilder, который выведет прокси-адрес как " http://username:[email protected]/". К сожалению, конкретный прокси, который я использовал, не работал с этой техникой.
То, что я обнаружил после обширного Googling, заключается в том, что вы можете изменить прокси через WebRequest.DefaultProxy(статическое свойство).
Например:
WebProxy proxy = new WebProxy("http://myproxyserver",true);
proxy.Credentials = new NetworkCredential("username", "password");
WebRequest.DefaultWebProxy = proxy;
Ответ 4
Вы также можете попробовать следующее:
Программно получить то, что вы используете, а затем установить прокси-сервер непосредственно, например.
var binding = new WSDualHttpBinding("WSDualHttpBinding_IMainService");
binding.ProxyAddress = new Uri("http://192.168.5.1:3128");
где "WSDualHttpBinding_IMainService"
- это имя вашей привязки из вашего файла конфигурации.
Также вы должны установить UseDefaultWebProxy=false
; в противном случае ваш прокси-сервер будет проигнорирован.