Служба REST WCF не принимает JSON в .Net 4 - PullRequest
9 голосов
/ 15 февраля 2011

Я пробовал стандартные точки, которые были введены как часть .Net 4, и я получаю самые специфические ошибки.

Мой код

[ServiceContract]
public interface IAuthenticator
{
    [OperationContract]
    [WebInvoke(UriTemplate = "AuthenticateUser", Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json)]
    AuthPacket AuthenticateUser(string Username, string Password, string DeviceId);
}

Мой web.config

<system.web>
  <compilation debug="true" targetFramework="4.0" />
</system.web>

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
  </modules>
</system.webServer>

<system.serviceModel>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
  <standardEndpoints>
    <webHttpEndpoint>
      <!--
          Configure the WCF REST service base address via the global.asax.cs file and the default endpoint
          via the attributes on the <standardEndpoint> element below
      -->
      <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true"/>
    </webHttpEndpoint>
  </standardEndpoints>
</system.serviceModel>

Исключение, которое сводит меня с ума!

415 Cannot process the message because the content type 'application/json' was not 
the expected type 'text/xml; charset=utf-8'.

Я могу решить эту проблему, вернувшись к стандарту .Net 3.5, в котором объявляется каждая служба, но, если я не ошибаюсь, одним из основных обновлений WCF с .Net 4 была его способность обрабатывать подобные вещи. , Я что-то не так делаю?

1 Ответ

6 голосов
/ 15 февраля 2011

Если я правильно прочитал этот контракт, вы определили JSON как ваш формат ответа , но не ваш запрос формат:

[ServiceContract]
public interface IAuthenticator
{
    [OperationContract]
    [WebInvoke(UriTemplate = "AuthenticateUser", Method = "POST", 
     BodyStyle = WebMessageBodyStyle.WrappedRequest, 
     ResponseFormat = WebMessageFormat.Json)]
    AuthPacket AuthenticateUser(string Username, string Password, string DeviceId);
}

Может ли это быть проблемой? Что произойдет, если вы добавите RequestFormat = WebMessageFormat.Json к своему операционному контракту ??

[ServiceContract]
public interface IAuthenticator
{
    [OperationContract]
    [WebInvoke(UriTemplate = "AuthenticateUser", Method = "POST", 
     BodyStyle = WebMessageBodyStyle.WrappedRequest, 
     RequestFormat = WebMessageFormat.Json,   <== ADD THIS HERE TO YOUR CODE !
     ResponseFormat = WebMessageFormat.Json)]
    AuthPacket AuthenticateUser(string Username, string Password, string DeviceId);
}

Обновление: , если вы используете WCF 4 "из коробки", его сопоставление протокола свяжет схему http:// с basicHttpBinding.

Чтобы это исправить, вам нужно переопределить сопоставление протокола по умолчанию, как это (в вашем web.config):

Отображение протокола по умолчанию

Ответ на этот вопрос прост. WCF определяет сопоставление протокола по умолчанию между схемами транспортного протокола (например, http, net.tcp, net.pipe и т. Д.) И встроенными привязками WCF. Сопоставление протокола по умолчанию находится в файле .NET 4 machine.config.comments и выглядит следующим образом:

<system.serviceModel>
   <protocolMapping>
       <add scheme="http" binding="webHttpBinding" bindingConfiguration="" />
   </protocolMapping>

Теперь по умолчанию http://..... будет сопоставлено с webHttpBinding.

(взято из: Введение разработчика в Windows Communication Foundation 4 )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...