WCF - динамически изменять WebResponseFormat - PullRequest
1 голос
/ 30 марта 2010

Есть ли способ динамически изменить WebResponseFormat для метода, заданного параметром, переданным клиентом? Я по умолчанию использую свой WebResponseFormat для XML, но я хочу дать клиенту возможность указать формат в формате JSON или XML, и, если он не указан, по умолчанию используется XML.

В настоящее время я делаю следующее:

[WebGet(UriTemplate = "objects", BodyStyle = WebMessageBodyStyle.Bare)]
[OperationContract]
List<SampleObject> GetObjects();

Пользователь может позвонить через:

http://localhost/rest/myservice/objects

Затем они могут указать формат, выполнив:

http://localhost/rest/myservice/objects?format=json

Проблема в том, что когда я пытаюсь установить тип содержимого ответа через:

WebOperationContext.Current.OutgoingResponse.ContentType = "application/json";

Это просто возвращает XML, но браузер пытается обработать его как объект JSON вместо сериализации ответа как JSON.

Возможно ли это даже при использовании .NET 3.5 за пределами использования Stream в качестве возвращаемого значения и сериализации ответа самостоятельно? Если нет, есть ли лучшее решение?

Ответы [ 2 ]

1 голос
/ 01 апреля 2010

Мне удалось решить эту проблему, выполнив следующие действия:

[WebGet(UriTemplate = "objects", BodyStyle = WebMessageBodyStyle.Bare)]
[OperationContract]
List<SampleObject> GetObjects();

[WebGet(UriTemplate = "objects?format=json", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
[OperationContract]
List<SampleObject> GetObjectsInJson();

Это не красиво, но если формат = xml определен или не указан, по умолчанию будет использоваться мой контракт на операцию, но если определен формат = json, по умолчанию будет использоваться второй контракт. Это успешно возвращает результат в виде JSON и XML по желанию.

0 голосов
/ 30 марта 2010

Для .NET 3.5 и WCF REST 3.5 я не знаю ни одного способа сделать это элегантно.

.NET 4 и WCF REST в .NET 4 будут поддерживать используемую вами стратегию «согласования контента» - просто установка ContentType = "application/json" заставит службу автоматически возвращать JSON вместо XML.

Так что, если у вас есть шанс, подождите .NET 4 (должен появиться в середине апреля 2010 г.) и используйте его - в любом случае он должен предложить множество улучшений в WCF, особенно в области REST WCF.

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