Возврат JSON из службы WCF, контракт на обслуживание которой помечен с помощью XmlSerializerFormatAttribute
Позвольте мне сначала немного описать мою проблему.
Я начал работать над приложением Xamarin, которое должно было использовать наш API. API предоставляется через службу WCF на двух конечных точках, и это либо tcp, либо базовый http. Из-за ограничений платформы Xamarin я в итоге использовал HttpWebClient, для которого мне пришлось сделать свою службу WCF спокойной. Это где проблемы начинают появляться.
Я определил другую конечную точку, которую я назвал "rest", и настроил ее на возвращение JSON через свойство DefaultOutgoingResponseFormat. Это свойство не действует, потому что я всегда получаю ответ в виде XML.
Если я удалю атрибут XmlSerializerFormatAttribute, мой сервис вернет мне JSON, но теперь у меня нет XML. Это легко исправить, создав другую конечную точку, возвращаемым значением по умолчанию будет XML, но теперь проблемы становятся еще более интересными, поскольку некоторые из моих классов не будут сериализованы должным образом, и я объясню это сейчас.
Существует атрибут с именем XmlIgnore, который помещается в свойство. Если у вас есть свойство с именем Name и другое свойство с именем NameSpecified и если вы поместите этот атрибут в NameSpecified, свойство Name не будет сериализовано в случае, если свойство NameSpecified содержит значение false. Это чрезвычайно полезно, потому что отправляемый XML не переполнен бесполезной информацией. Мы хотим сохранить это, что фактически означает, что мы хотим сохранить XmlSerializerFormatAttribute, но также иметь возможность возвращать JSON.
Это возможно?
1 ответ
Как только вы используете XmlSerializerFormat
вы говорите WCF использовать XmlSerializer
класс над DataContractSerializer
, В WCF нет встроенного механизма, который мог бы заставить его теперь возвращать JSON, потому что вы явно сказали ему использовать XmlSerializer
,
Если вы хотите вернуть содержимое в формате XML или JSON, вы можете полностью взять на себя ответственность за форматирование сообщения, создав собственное IDispatchMessageFormatter
реализация. После этого вам остается только отформатировать ваши сообщения с любыми правилами, которые вы пожелаете.