Как установить 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 "Эта коллекция уже содержит адрес со схемой http"
  • Как программно подключить клиента к службе WCF?
  • Как запретить Visual Studio запускать WcfSvcHost.exe во время отладки?
  • Адрес конечной точки изменения WCF во время выполнения
  • Как я могу игнорировать свойство при сериализации с помощью DataContractSerializer?
  • WCF Datacontract, некоторые поля не десериализуются
  • создание WCF ChannelFactory
  • Почему разработчик должен использовать веб-службы вместо прямых подключений к db?
  • Ведение журнала исключений для служб WCF с использованием ELMAH
  • Найти следующий TCP-порт в .Net
  • Является ли .NET Remoting действительно устаревшим?
  • Давайте будем гением компьютера.