WCF: как сделать «Добавить ссылку на службу» в службу SSL (я получаю ошибки) - PullRequest
3 голосов
/ 02 мая 2011

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 Ответ

4 голосов
/ 02 мая 2011

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

<system.serviceModel>
   <protocolMapping>
      <remove scheme="http" />
      <add scheme="http" binding="wsHttpBinding" bindingConfiguration="" />
   </protocolMapping>
... snip ...
</system.serviceModel>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...