Вызов веб-службы с использованием 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, но он должен быть изменчивым. Прокси-сервер тоже.