Игнорировать тип содержимого для определенных WCF OperationContracts - PullRequest
2 голосов
/ 13 декабря 2011

У меня есть служба WCF REST, которая в основном отправляет и получает JSON.

В общем, я в порядке с использованием DataContractJsonSerializer, но для некоторых объектов, которые передаются в качестве параметров в методы OperationContact, мне нужно использовать JSON.NET для десериализации.

Для этого стандартным подходом является Stream в качестве входного параметра.

[OperationContract]
[WebInvoke(UriTemplate = "DoStuff", Method = "POST",
           BodyStyle = WebMessageBodyStyle.Bare)]
public void SetAppSettings(Stream input)
{
    // parse input as JSON string, deserialize, process
}

Однако, когда я пытаюсь POST-контент с Content-Type: application/json к этому методу, я получаю исключение, сообщающее, что ожидается необработанный контент.

С точки зрения клиента, я всегда отправляю application/json контент. Я не хочу, чтобы клиент знал, что он должен установить Content-Type: text/plain вместо application/json (который используется в любом другом случае).

Есть ли способ заставить WCF игнорировать тип содержимого запроса для определенных OperationContracts (вместо переключения на необработанную модель для всей службы)?

В качестве альтернативы, есть ли способ, которым я мог бы опустить параметр Stream и вместо этого получить необработанные байты тела запроса, скажем, из HttpContext.Current, находясь внутри метода?

1 Ответ

0 голосов
/ 13 декабря 2011

Вы пытались явно установить формат запроса на уровне контракта на эксплуатацию?

[OperationContract]
[WebInvoke(UriTemplate = "DoStuff", Method = "POST",
           BodyStyle = WebMessageBodyStyle.Bare
           **RequestFormat = WebMessageFormat.Json**)]
public void SetAppSettings(Stream input)
{
    // parse input as JSON string, deserialize, process
}
...