Проблема Restful WCF POST с запросом типа содержимого application/json

Я настроил RESTful WCF со следующей «операцией» POST:

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "/Test", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json)]
void PostTest(Stream stream);

В моем web.config я настроил следующее:

<service name="MyTest.TestSvc" behaviorConfiguration="MyTest.TestBehavior" >
    <endpoint address="" behaviorConfiguration="MyBehavior" binding="webHttpBinding" contract="MyTest.ITestSvc"/>
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>

<endpointBehaviors>
    <behavior name="MyBehavior">
        <webHttp />
    </behavior>
</endpointBehaviors>

<serviceBehaviors>
    <behavior name="MyTest.TestBehavior">
        <serviceMetadata httpGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
</serviceBehaviors>

Когда я отправил сообщение POST, используя "text/plain" или "json", все работает нормально. Однако, когда я пытаюсь отправить сообщение POST с ContentType = "application/json", происходит сбой со следующим сообщением: Удаленный сервер вернул ошибку: (400) Неверный запрос >

Единственное решение, которое я нашел, состояло в том, чтобы определить класс Factory: System.ServiceModel.Activation.WebServiceHostFactory в разметке определения Svc.

Я нашел это решение по следующей ссылке: Отправить JSON в WCF 3.5 с помощью Ajax

Как я понял, определение WebServiceHostFactory полезно только в том случае, если вы не хотите редактировать файл web.config.

Как я могу заставить его работать без определения WebServiceHostFactory?

Обратите внимание, что мне удалось получить POST-сообщение типа содержимого «json», но не тип содержимого «application/json».


person Tomer Peled    schedule 12.12.2012    source источник


Ответы (1)


Проблема в том, что для использования необработанной модели программирования (с использованием параметра Stream) вам нужно указать WCF не пытаться понять запрос как JSON, вместо этого просто передать необработанное тело запроса параметру. Вы можете сделать это, используя WebContentTypeMapper. Сообщение по адресу http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-receive-arbitrary-data.aspx показывает, как это можно сделать. Решение с фабрикой работает, потому что оно делает это, когда создает конечную точку.

person carlosfigueira    schedule 12.12.2012