Вызов веб-службы с использованием WCF через Http и Https
В нашем проекте у нас есть веб-сервис java, который работает через http и https.
Мы хотим использовать http внутри и https для внешней версии нашего веб-приложения.
Итак, мы создали прокси-класс в нашем приложении, и мы установили привязку для http в web/app.config, и все работает нормально.
Какие изменения нам нужно внести в код и конфигурацию для поддержки https для одной и той же службы в нашем внешнем приложении? Если возможно, отправьте фрагменты кода для объяснения!
Ответы
Ответ 1
Я нашел ответ, копающийся в MSDN.
В моем случае я использовал пользовательскую привязку:
<customBinding>
<binding name="jsonpBinding">
<jsonpMessageEncoding/>
<httpTransport manualAddressing="true"/>
</binding>
</customBinding>
Это было указано в сервисе
<services>
<service name="{YourInfoHere}">
<endpoint address="" binding="customBinding" bindingConfiguration="jsonpBinding" behaviorConfiguration="{YourInfoHere}" contract="{YourInfoHere}"/>
</service>
</services>
Добавление второй привязки, которая использовала httpsTransport, а затем вторую услугу, которая использовала эту привязку, сделала трюк. Конечный результат:
<services>
<service name="{YourInfoHere}">
<endpoint address="" binding="customBinding" bindingConfiguration="jsonpBinding" behaviorConfiguration="{YourInfoHere}" contract="{YourInfoHere}"/>
<endpoint address="" binding="customBinding" bindingConfiguration="jsonpBindingHttps" behaviorConfiguration="{YourInfoHere}" contract="{YourInfoHere}"/>
</service>
</services>
<bindings>
<customBinding>
<binding name="jsonpBinding">
<jsonpMessageEncoding/>
<httpTransport manualAddressing="true"/>
</binding>
<binding name="jsonpBindingHttps">
<jsonpMessageEncoding/>
<httpsTransport manualAddressing="true" />
</binding>
</customBinding>
</bindings>
Не может быть идеальным, но он работает. Это были единственные изменения, которые я сделал, чтобы заставить SSL работать. Поскольку все это связано с привязкой и транспортом, код остается тем же.
Соответствующие ссылки MSDN:
Ответ 2
Я предполагаю, что вы используете basichttpbinding. Затем вам нужно сделать две вещи:
- измените адрес на https:)
- установить режим безопасности для транспорта
Ответ 3
См. Настройка HTTP и HTTPS:
Использование Windows Communication Foundation (WCF) через HTTP либо требует использование хоста, такого как Интернет Информационные службы (IIS) или руководство настройка параметров HTTP через API HTTP-сервера. Эта документ описывает вручную настройка WCF при использовании HTTP и HTTPS.
А также см. Необходимые привязки WCF для HTTPS:
Я только что закончил писать свой первый производства WCF, которое работал очень хорошо, пока я не развернул его к нашей производственной среде. Все внезапно ни один из вызовов WCF не работа, и я бы получил JavaScript Ошибка "TestService не определена". Когда я заглядываю в службу JS (в режиме отладки), я получил следующая ошибка:
Не удалось найти базовый адрес, соответствующий схеме http для конечной точки с привязкой WebHttpBinding. Схемы зарегистрированных базовых адресов: [HTTPS]
Таким образом, по-видимому, моя служба WCF зарегистрировал себя как HTTPS (поскольку по SSL), но моя привязка была только настроен для HTTP. Решение для определения пользовательского связывания внутри вашего Файл Web.Config и установите защиту режим "Транспорт". Тогда вы просто необходимо использовать bindingConfiguration свойство внутри вашей конечной точки определение, чтобы указать на пользовательский связывание. Все поддерживаемые HTTPS system.serviceModel раздел ниже:
Ответ 4
Я понимаю, что вы используете WCF для создания клиента, который подключается к удаленному веб-сервису, через HTTPS.
Для этого просто измените конфигурационный файл на стороне клиента для приложения, работающего под WCF, заменив http://server.address на https://server.address, в файле configuration/system.serviceModel/client/endpoint/@address. так:
<configuration>
<system.serviceModel>
...
<client>
<!-- change only the address string -->
<endpoint address="https://server.name/Whatever"
everything.else.stays.the.same />
</client>
</system.serviceModel>
</configuration>
(Путь к файлу конфигурации зависит от обычных правил .NET: будь то приложение ASPNET или служба, и т.д.)
ИЛИ вы можете явно указать адрес в коде:
// instantiate new proxy to web service
var svc= new ServiceClient();
var e = svc.Endpoint;
e.Address = new System.ServiceModel.EndpointAddress("https://server.address/JavaServiceUri");
Я настоятельно рекомендую вам настроить адрес, а не его жесткий код. Это не значит, что он должен храниться в app.config, но он должен быть изменчивым. Прокси-сервер тоже.