WCF поддерживает множество параметров сложных типов для большинства привязок. Это только WebHttpBinding, который этого не делает.
ция '' контракта '' определяет несколько параметров тела запроса для сериализации без каких-либо элементов-оболочек. Максимум один параметр тела может быть сериализован без элементов оболочки. Либо удалите дополнительные параметры тела, либо установите для свойства BodyStyle в WebGetAttribute / WebInvokeAttribute значение Wrapped.
Я пытаюсь открыть службу WCF C # 4.0 с помощью JSON через следующую конфигурацию (устанавливается с помощью редактора конфигурации WCF):
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<services>
<service name="iPhoneAPI.API">
<endpoint address="" behaviorConfiguration="NewBehavior0" binding="webHttpBinding"
bindingConfiguration="" contract="iPhoneAPI.IApi" />
</service>
</services>
<protocolMapping>
<add scheme="http" binding="webHttpBinding" bindingConfiguration="" />
</protocolMapping>
<behaviors>
<endpointBehaviors>
<behavior name="NewBehavior0">
<webHttp defaultOutgoingResponseFormat="Json" />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
Когда я получаю доступ к /API.svc, я получаю ранее перечисленное сообщение об исключении.
Если я укажу только следующий (без параметров) контракт, сервис работает:
[OperationContract]
[WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "test")]
GenericApiResult<IEnumerable<LiveFeedEntity>> test();
Если у меня есть методы, которые требуют параметры, которые не являются строками, я получаю ранее перечисленное исключение.
Пример:
[OperationContract]
[WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "login")]
LoginApiResult Login(String UserName, String Password);
Если я изменю эту функцию так:
[OperationContract]
[WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "login/{UserName}/{Password}")]
LoginApiResult Login(String UserName, String Password);
Оно работает; но это возможно только для параметров типа String. Как я могу воспроизвести это для других моих функций, таких как:
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "logout")]
GenericApiResult<bool> Logout(Guid SessionKey);
Перепробовал много поисков в гугле, но оказался с пустыми руками, любая помощь приветствуется.
Ура,
Ник.