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

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

4 ответа

Решение

Настройки прокси являются частью конфигурации привязки. Например, посмотрите на свойство ProxyAddress классов / элементов конфигурации BasicHTTPBinding и 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; в противном случае ваш прокси будет игнорироваться.

Я нашел решение для тех, кто может использовать.NET Core 2.x

Что изначально вызывает проблему при попытке установить прокси с помощью

System.ServiceModel.BasicHttpBinding;

как ответил Чизо.

Вам необходимо обновить WCF до последней версии (v.4.7.0).

Перейдите в Диспетчер пакетов NuGet -> Обновите все связанные URL-адреса проекта WCF.

Должно быть:

  • System.ServiceModel.Security
  • System.ServiceModel.NetTcp
  • System.ServiceModel.Http
Другие вопросы по тегам