Как установить Json.Net в качестве сериализатора по умолчанию для службы WCF REST

Можно ли переопределить поведение WCF DataContractSerializer по умолчанию, когда Serialize / DeSerialize сущности и вместо этого использовать JSON.NET?

У меня есть следующий контракт на обслуживание объекта City. По соображениям дизайна объект City имеет IsReference = true, и поэтому по умолчанию DataContractSerializer вызывает ошибки.

Для методов «GET» я могу справиться с ситуацией с JsonConvert.DeserializeObject, но с методами «PUT, POST, DELETE» DataContractSerializer имеет приоритет и не отвечает, что объекты IsReference не могут быть сериализованы.

Я нашел это сообщение для реализации IOperationBehavior и предоставления собственного Serializer, но я не знаю, как интегрировать Json.NET с этим. и я считаю, что для этого должен быть более прямой подход.

Я был бы признателен за любую помощь или руководство в отношении этого сценария или рекомендации другим подходам.

[ServiceContract] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed) [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] public class CityService { [Description("Get all Cities")] [WebGet(UriTemplate = "")] public Message Cities() { } [Description("Allows the details of a single City to be updated.")] [WebInvoke(UriTemplate = "{code}", Method = "PUT")] public Message UpdateCity(string code, City city) { } } 

Большое спасибо

Hossam

Использование расширенных кодеров и сериализаторов (см. http://msdn.microsoft.com/en-us/library/ms733092.aspx ) или другие методы расширения WCF, такие как использование DataContractSerializerOperationBehavior , очень интересно, но для вашей особой проблемы есть более простые способы решения.

Если вы уже используете тип Message чтобы возвращать результаты, используйте WCF4, вы можете сделать что-то вроде следующего:

 public Message UpdateCity(string code, City city) { MyResponseDataClass message = CreateMyResponse(); // use JSON.NET to serialize the response data string myResponseBody = JsonConvert.Serialize(message); return WebOperationContext.Current.CreateTextResponse (myResponseBody, "application/json; charset=utf-8", Encoding.UTF8); } 

В случае ошибок (например, HttpStatusCode.Unauthorized или HttpStatusCode.Conflict ) или в других ситуациях, когда вам нужно установить код состояния HTTP (например, HttpStatusCode.Created ), вы можете продолжать использовать WebOperationContext.Current.OutgoingResponse.StatusCode .

В качестве альтернативы вы также можете вернуть Stream (см. http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-web.aspx и http: // msdn .microsoft.com / en-us / library / ms732038.aspx ) вместо Message для возврата любых данных без дополнительной обработки по умолчанию с помощью сериализатора Microsoft JSON. В случае WCF4 вы можете использовать CreateStreamResponse (см. CreateStreamResponse ) вместо CreateTextResponse . Не забудьте установить позицию streamа в 0 после записи в streamе, если вы будете использовать эту технику для получения ответа.

Есть ли причина, по которой вы хотите использовать библиотеку Json.NET. Если вы хотите вернуть JSON, почему бы просто не использовать свойство ResponseFormat из атрибутов WebGet и WebInvoke?

 [WebGet(UriTemplate = "", ResponseFormat = WebMessageFormat.Json)] 

Это необходимо для большинства случаев. Какую версию WCF вы используете? Любая причина, по которой вы возвращаете тип сообщения, а не фактический тип?

Определите его в своей сервисной веб-конфигурации для поведения службы:

       

или в вашем операционном договоре вашего интерфейса

 [OperationContract] [WebInvoke(Method = "GET", UriTemplate = "/advertisements/{app_id}/{access_token}/{genero}/{age}", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] 
  • Возврат сервиса WCF «Метод не разрешен»
  • WCF vs ASP.NET Web API
  • Динамическое изменение URL-адреса URL-адреса веб-службы WCF через файл конфигурации
  • Не удается использовать службы WCF в IIS для Windows 8
  • WCF Datacontract, некоторые поля не десериализуются
  • Шаблон для вызова службы WCF с использованием async / wait
  • ASP.NET MVC и веб-службы
  • Как обрабатывать запрос Ajax JQUERY POST с помощью WCF-хоста
  • jqGrid не заполняет данными
  • Проблема отправки JSON-данных из JQuery в метод REST WCF
  • Как вызвать службу WCF с помощью ksoap2 на Android?
  • Давайте будем гением компьютера.