visual studio servicio paso mundo hola crear configurar wcf json rest .net-4.0 json.net

studio - wcf soap service c#



Cómo configurar Json.Net como el serializador predeterminado para el servicio WCF REST (2)

¿Hay alguna razón por la que desea utilizar la biblioteca Json.NET específicamente? Si desea devolver JSON, ¿por qué no utilizar la propiedad ResponseFormat de los atributos WebGet y WebInvoke?

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

Eso debería para la mayoría de los casos. ¿Qué versión de WCF está ejecutando? ¿Alguna razón por la que está devolviendo un tipo de mensaje en lugar del tipo real?

¿Es posible anular el comportamiento predeterminado de WCF DataContractSerializer cuando Serialize / DeSerialize entidades y usar JSON.NET en su lugar?

Tengo el siguiente contrato de servicio para manejar la entidad de la Ciudad. Por motivos de diseño, la entidad de la ciudad tiene IsReference = true y, por lo tanto, el DataContractSerializer predeterminado genera errores.

Para los métodos "GET", puedo manejar la situación con JsonConvert.DeserializeObject, pero con los métodos "PUT, POST, DELETE" DataContractSerializer tiene prioridad y falla al quejarse por las entidades IsReference que no pueden ser serializadas.

He encontrado esta publicación para implementar IOperationBehavior y proporcionar mi propio serializador, pero no sé cómo integrar Json.NET con esto. y creo que debería haber un enfoque más directo para esto.

Agradecería cualquier ayuda u orientación con respecto a este escenario o consejos para otros enfoques.

[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) { } }

Muchas gracias

Hossam


El uso de Encoders y serializadores extendidos (vea http://msdn.microsoft.com/en-us/library/ms733092.aspx ) u otros métodos de Extender WCF como el uso de DataContractSerializerOperationBehavior es muy interesante, pero para su problema especial hay formas de solución más fáciles.

Si ya usa el tipo de Message para devolver los resultados y usa WCF4, puede hacer algo como lo siguiente:

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); }

En caso de errores (como HttpStatusCode.Unauthorized o HttpStatusCode.Conflict ) o en otras situaciones cuando necesita establecer un código de estado HTTP (como HttpStatusCode.Created ) puede continuar utilizando WebOperationContext.Current.OutgoingResponse.StatusCode .

Como alternativa, también puede devolver un Stream (consulte http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-web.aspx y http: // msdn). .microsoft.com / es-us / library / ms732038.aspx ) en lugar de Message para devolver datos sin procesamiento predeterminado adicional por el serializador Microsoft JSON. En el caso de WCF4 puede usar CreateStreamResponse (vea http://msdn.microsoft.com/en-us/library/dd782273.aspx ) en lugar de CreateTextResponse . No olvides establecer la posición del flujo en 0 después de escribir en el flujo si usarás esta técnica para producir la respuesta.