Вопрос по wcf, wcf-binding, web-config – Web.Release.config

23

ратил много времени на выяснение того, как настроить мои службы WCF, чтобы они работали для https в производственной среде.

По сути, мне нужно было сделать это:

<behaviors>
  <serviceBehaviors>
    <behavior name="MyServiceBehavior">
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
<services>
  <service name="MyNamespace.MyService" behaviorConfiguration="MyServiceBehavior">
    <endpoint address="" bindingNamespace="https://secure.mydomain.com" binding="basicHttpBinding" bindingConfiguration="HttpsBinding" contract="MyNamespace.IMyService"/>
  </service>
</services>
<bindings>
  <basicHttpBinding>
    <binding name="HttpsBinding">
      <security mode="Transport">
        <transport clientCredentialType="None"></transport>
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

ДобавлениеbindingNamespace Атрибут конечной точки - это последнее, что заставило его работать.

Но этот конфиг не работает в моей локальной среде разработки, где я работаю под обычным http. Так что мой конфиг есть:

<behaviors>
  <serviceBehaviors>
    <behavior name="MyServiceBehavior">
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
<services>
  <service name="MyNamespace.MyService" behaviorConfiguration="MyServiceBehavior">
    <endpoint address="" binding="basicHttpBinding" contract="MyNamespace.IMyService"/>
  </service>
</services>

Различия здесь в том, что я установилhttpsGetEnabled атрибут false, и я удалил bindingConfiguration и bindingNamespace.

Проблема в:Как создать один блок конфигурации, который обрабатывает ОБА?

Я действительно ненавижу делать много специальных изменений в конфигурации каждый раз, когда делаю релиз. Да, я знаю, что у меня может быть задача после сборки, которая автоматически меняет значения, но я бы хотел объединить конфигурации, если это возможно.

Я попробовал что-то вроде этого:

<behaviors>
  <serviceBehaviors>
    <behavior name="MyServiceBehavior">
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
<services>
  <service name="MyNamespace.MyService" behaviorConfiguration="MyServiceBehavior">
    <endpoint address="" binding="basicHttpBinding" contract="MyNamespace.IMyService"/>
    <endpoint address="" bindingNamespace="https://secure.mydomain.com" binding="basicHttpBinding" bindingConfiguration="HttpsBinding" contract="MyNamespace.IMyService"/>
  </service>
</services>
<bindings>
  <basicHttpBinding>
    <binding name="HttpsBinding">
      <security mode="Transport">
        <transport clientCredentialType="None"></transport>
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

Я полагал, что установка обеих конечных точек даст две возможности для поиска при активации службы. Тем не менее, это не работает. Я получаю эту ошибку:

Не удалось найти базовый адрес, который соответствует схеме https для конечной точки с привязкой BasicHttpBinding. Схемы зарегистрированных базовых адресов: [http].

Из оглядки SO и всего остального интернета видно, что у других были проблемы с убийством этого дракона.

@Cristi нет, я должен был оставить разные конфиги между dev и prod. В последние несколько лет я почти везде ушел из WCF, поэтому проблема устарела (по крайней мере, для меня). sohtimsso1970
Вы размещаете свой сервис WCF в IIS, или вы самостоятельно? marc_s
@ sohtimsso1970: Вы нашли решение для этого? Learner
На самом деле это сработало в конце концов для меня. Проблема заключалась в том, что в IIS не было установлено http-привязки (удалил его во время некоторых тестов и забыл) Learner
Они размещаются в виде файлов .svc в веб-приложении ASP.NET. Использование IIS7 на dev и prod. sohtimsso1970

Ваш Ответ

3   ответа
2

Проблема не в файле конфигурации, а в настройке IIS. Вам нужно включить HTTP и HTTPS в IIS. В IIS 7.5 перейдите на свой сайт и нажмите «Привязки» в разделе «Изменить действие сайта». Убедитесь, что оба http и https были добавлены. Затем вам нужно создать привязку для HTTP под<basicHttpBinding>, с режимом безопасности, установленным на нет. Добавьте вновь созданную конфигурацию привязки в конечную точку http. Тебе хорошо идти. Дайте мне знать, если вам нужна дополнительная проблема.

Моя проблема:переплеты ((type:hostname:port)) в IIS:http: нет hostaname: 49759, https: pre.company.es: 443 а такжеHttp: pre.company.es: 80, А ТАКЖЕBaseAddress: консервант: 49759 / vdir1 / SilverlightServices / serv.svc а такжеpre.company.es/vdir1/SilverlightServices/serv.svc Kiquenet
0

а также для работы в производственной и других средах, не полагаясь на память, чтобы что-либо изменить, является преобразование конфигурации. Они преобразуют скомпилированный файл web.config на основе выбранного профиля конфигурации. Локально я бегу вDebug режим, в среде тестирования япубликовать кTestRelease профиль, а производство у меня другой профиль:

Если вы не можете расширить свой файл web.config, вы можете щелкнуть правой кнопкой мыши и добавить конфигурационные преобразования. Чтобы получить больше, чем Debug и Release, вы добавляете больше конфигураций через менеджер:

Вот пример преобразования:

Web.Debug.config
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <!--...-->
  <system.serviceModel>
    <protocolMapping>
      <add binding="basicHttpBinding" scheme="http" xdt:Transform="SetAttributes" />
    </protocolMapping>
    <bindings>
      <basicHttpBinding>
        <binding xdt:Locator="Match(name)" name="basicHttpBindingConfiguration">
          <security xdt:Transform="Remove">
            <transport xdt:Transform="Remove"/>
          </security>
        </binding>
        <binding xdt:Locator="Match(name)" name="fileTransferBinding">
          <security xdt:Transform="Remove">
            <transport xdt:Transform="Remove"/>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
  </system.serviceModel>
</configuration>
Web.Release.config
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <!--...-->
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" xdt:Transform="Replace"/>
          <serviceDebug includeExceptionDetailInFaults="false" xdt:Transform="Replace"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
      <add binding="basicHttpsBinding" scheme="https" xdt:Transform="Replace"/>
    </protocolMapping>
    <bindings>
      <basicHttpBinding>
        <binding xdt:Locator="Match(name)" name="basicHttpBindingConfiguration">
          <security mode="Transport" xdt:Transform="Insert">
            <transport clientCredentialType="None" proxyCredentialType="None" />
          </security>
        </binding>
        <binding xdt:Locator="Match(name)" name="fileTransferBinding">
          <security mode="Transport" xdt:Transform="Insert">
            <transport clientCredentialType="None" proxyCredentialType="None" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
  </system.serviceModel>
  <system.webServer>
    <directoryBrowse enabled="false"  xdt:Transform="Replace"/>
  </system.webServer>
</configuration>
14

одна проблема с вашей объединенной конфигурацией состоит в том, что ваши две конечные точки находятся на одном и том же адресе - это не сработает.

Если вы размещаете хостинг в IIS, то ваш сервер, виртуальный каталог и необходимый файл * .svc будут определять ваш базовый адрес - это будет что-то вроде:

http://yourservername/VirtualDirectory/YourService.svc

Если вы хотите иметь две конечные точки, по крайней мере одна из них должна определить относительный адрес:

<services>
    <service name="MyNamespace.MyService" 
             behaviorConfiguration="MyServiceBehavior">
       <endpoint 
           address="basic" 
           binding="basicHttpBinding" 
           contract="MyNamespace.IMyService"/>
       <endpoint 
           address="secure" 
           binding="basicHttpBinding" bindingConfiguration="HttpsBinding"  
           contract="MyNamespace.IMyService"/>
    </service>
</services>

В этом случае ваша конечная точка HTTP будет включена:

http://yourservername/VirtualDirectory/YourService.svc/basic

и ваша защищенная конечная точка HTTPS на:

https://yourservername/VirtualDirectory/YourService.svc/secure

Более того: ваша защищенная конечная точка используетHttpsBinding конфигурация - но вам не хватает такой конфигурации привязки - все, что у вас есть, это:

<bindings>
  <basicHttpBinding>
    <binding name="HttpBinding">
      <security mode="None">
        <transport clientCredentialType="None"></transport>
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

Вам нужно добавитьHttpsBinding конфигурация !!

<bindings>
  <basicHttpBinding>
    <binding name="HttpBinding">
      <security mode="None">
        <transport clientCredentialType="None"></transport>
      </security>
    </binding>
    <binding name="HttpsBinding">
      <security mode="Transport">
          <transport clientCredentialType="Windows" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
Если я понимаю, как работают адреса конечных точек, добавление этих относительных местоположений изменит место доступа к URL. Я хочу использовать один и тот же URL в dev и prod. Поэтому я не хочу добавлять «основной» или «безопасный» в конце только потому, что я переключился на https. Вы говорите, что это невозможно иначе? sohtimsso1970
На момент написания этого поста, для службы, работающей через http и https, требовалось две конечные точки. В какой-то момент эта проблема была исправлена, и http и https могут обслуживаться с одной и той же конечной точки. Ben Gripka
Этот ответ действительно работает. Для одного адреса просто удалите поле адреса или определите тот же адрес для конечной точки. Anicho
Вот пример того, как иметь один и тот же URL для защищенных и незащищенных конечных точек.stackoverflow.com/questions/4797802/... Oleg Savelyev
Вы когда-нибудь находили решение для включения HTTP / HTTPS на одной конечной точке? Я нахожусь в той же ситуации - по сути, я ищу, чтобы изменить значение securityMode в конфигурации привязки на основе текущей схемы запроса в коде StickyMcGinty

Похожие вопросы