Как установить 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; в противном случае ваш прокси-сервер будет проигнорирован.