Как установить прокси-сервер HTTP (WebProxy) на прокси-сервере службы на стороне клиента WCF? - PullRequest
45 голосов
/ 04 июня 2009

Как я могу установить прокси 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?

Связанный:
- как установить прокси с учетными данными для сгенерированного wcf-клиента

Ответы [ 4 ]

51 голосов
/ 10 июня 2009

Имеет смысл, что у прокси 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");
25 голосов
/ 05 июня 2009

Настройки прокси являются частью конфигурации привязки. Например, посмотрите на ProxyAddress свойства BasicHTTPBinding и WSHttpBinding классы / элементы конфигурации.

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

20 голосов
/ 26 июня 2009

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

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

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

Например:

WebProxy proxy = new WebProxy("http://myproxyserver",true);
proxy.Credentials = new NetworkCredential("username", "password");
WebRequest.DefaultWebProxy = proxy;
3 голосов
/ 29 ноября 2010

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

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

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

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

...