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);

Перепробовал много поисков в гугле, но оказался с пустыми руками, любая помощь приветствуется.

Ура,

Ник.

Ответы на вопрос(3)

Ваш ответ на вопрос