WCF: Как сделать «Добавить ссылку на службу» к службе SSL (я получаю ошибки)

#wcf #web-services #ssl #binding #service

#wcf #веб-сервисы #ssl #привязка #Обслуживание

Вопрос:

FooService.svc.cs:

 [ServiceContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
public interface IFooBar
{
    [OperationContract()]
    int Add(int num1, int num2);
}

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
public class FooService : IFooBar
{
    public int Add(int num1, int num2)
    {
        return num1   num2;
    }
}
  

Web.config:

 <?xml version="1.0" encoding="UTF-8"?>
<configuration>

  <system.web>
    <customErrors mode="Off"/>
    <globalization culture="en-US" uiCulture="en-US" />
    <compilation defaultLanguage="c#" targetFramework="4.0" />
  </system.web>

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
        <defaultDocument>
            <files>
                <add value="index.aspx" />
            </files>
        </defaultDocument>
  </system.webServer>

  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>

      <source name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
      <source name="System.Runtime.Serialization" switchValue="Verbose,ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add initializeData="App_tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelTraceListener" traceOutputOptions="Timestamp" />
    </sharedListeners>
  </system.diagnostics>

</configuration>
  

Я опубликовал файлы на своем сервере (на котором есть сертификат ssl), но когда я захожу на веб-страницу:https://localhost:443/FooService.svc Я получаю следующую ошибку…

Сообщение с запросом должно быть защищено. Это требуется для выполнения операции контракта (‘IFooBar’,’http://tempuri.org /’). Защита должна быть обеспечена привязкой (‘BasicHttpBinding’,’http://tempuri.org /’).

Это происходит независимо от того, перехожу ли я к URL напрямую или если я перехожу к Add Service Reference... из Visual Studio.


Кроме того, если я изменю [ServiceContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)] на [ServiceContract] , все будет работать нормально.

Ответ №1:

Привязкой по умолчанию для HTTP-транспорта в WCF 4 является BasicHttpBinding. Когда вы устанавливаете уровень защиты контракта на обслуживание на шифрование и подпись, привязка также должна поддерживать безопасность на уровне сообщений. Поскольку BasicHttpBinding не поддерживает безопасность на уровне сообщений, вам необходимо вручную настроить службу на wsHttpBinding или изменить схему протокола следующим образом:

 <system.serviceModel>
   <protocolMapping>
      <remove scheme="http" />
      <add scheme="http" binding="wsHttpBinding" bindingConfiguration="" />
   </protocolMapping>
... snip ...
</system.serviceModel>