#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>