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

Действительно ли возможно переопределить поведение WCF DataContractSerializer по умолчанию, когда Сериализируют/Десериализовывают объекты и используют JSON.NET вместо этого?

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

Для "ПОЛУЧИТЬ" методов я могу обработать ситуацию с JsonConvert. DeserializeObject, но с "ПОМЕЩЕННЫМ, POST, УДАЛЯЮТ" методы, DataContractSerializer имеет приоритет, и сбои, жалующиеся для объектов IsReference, не могут быть сериализированы.

Я имею, находят, что это Сообщение реализует IOperationBehavior и обеспечивает мой собственный Сериализатор, но я не знаю, как интегрировать 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

22
задан marc_s 25 June 2010 в 14:32
поделиться

2 ответа

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

Если вы уже используете тип Сообщение для возврата результатов, используя 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 .

В качестве альтернативы вы также можете вернуть поток (см. 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 ) вместо Сообщение для возврата любых данных без дополнительная обработка по умолчанию сериализатором Microsoft JSON. В случае WCF4 вы можете использовать CreateStreamResponse (см. http://msdn.microsoft.com/en-us/library/dd782273.aspx ) вместо CreateTextResponse . Не забудьте установить позицию потока равной 0 после записи в поток, если вы будете использовать эту технику для получения ответа.

21
ответ дан 29 November 2019 в 05:38
поделиться

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

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

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

1
ответ дан 29 November 2019 в 05:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: