Cómo establecer Json.Net como el valor predeterminado serializador de WCF RESTO de servicios

Es posible para reemplazar el valor predeterminado de WCF DataContractSerializer comportamiento a la hora de Serializar/Deserializar entidades y uso JSON.NET en su lugar?

Tengo el siguiente contrato de servicio para el manejo de la entidad Municipal. Por razones de diseño de la Ciudad entidad ha IsReference=true, y por lo tanto el valor predeterminado DataContractSerializer generar errores.

Para el «OBTENER» los métodos que puedo manejar la situación con JsonConvert.DeserializeObject, pero con «PUT,POST,DELETE» métodos DataContractSerializer tiene prioridad y no quejarse por el IsReference entidades no pueden ser serializados.

He de encontrar este Post para implementar IOperationBehavior y ofrecer mi propio Serializador, pero no sé cómo integrar Json.NET con esto. y creo que debería ser más sencillo enfoque para esto.

Agradecería cualquier ayuda u orientación con respecto a este escenario, o el asesoramiento a 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

  • Cómo trata de hacer lo mismo para la solicitud entrante? Solicitud entrante es json camelCase y la necesidad de ser serializado en C# PascalCase clases? Por favor, ver mi post aquí: stackoverflow.com/questions/50884879/…
InformationsquelleAutor Hossam | 2010-06-25

3 Kommentare

  1. 21

    El uso de la Ampliación de Codificadores y Serializadores (ver http://msdn.microsoft.com/en-us/library/ms733092.aspx) u otros métodos de extensión de WCF como el uso de DataContractSerializerOperationBehavior es muy interesante, pero para su problema hay solución más maneras.

    Si ya el uso de Message tipo de devolver el resultado de un uso WCF4 puede hacer es 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 en las que necesita para establecer un código de estado HTTP (como HttpStatusCode.Created) puede continuar el uso de WebOperationContext.Current.OutgoingResponse.StatusCode.

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

    • Oleg, muchas gracias, funciona como un encanto por la devolución de tipo de transmisión, deja de Microsft serializador. Soy consciente de DataContractSerializerOperationBehavior, pero me lleva a inheret mi propia Serializador de XmlObjectSerializer que no es una tarea fácil. Su propuesta es mucho más simple y directa, Gracias una vez más.
    • ¿Cómo manejar deserializar el entrante de la Ciudad de objeto?
    • Stott: Véase, por ejemplo, msdn.microsoft.com/en-us/library/ms734675.aspx empezando con la «Lectura de Mensajes».
    • A partir de ese vínculo, parece UpdateCity tendría que tomar un parámetro de Mensaje a ser capaz de deserializar con JSON.NET. Es eso correcto? De cualquier manera alrededor de ella?
    • Sé que es viejo, pero resuelto mi problema con los períodos de tiempo y fecha y formatos.
    • Es una buena noticia! Por la forma en que el uso de JSON.NET (Newtonsoft.Json) permite configurar alguna opción adicional que se utiliza durante la conversión: JsonSerializerSettings como el segundo/tercer parámetro de JsonConvert.SerializeObject y Formatting.Indented además. Yo, personalmente, en su mayoría, como el uso de ContractResolver con new CamelCasePropertyNamesContractResolver() y NullValueHandling con NullValueHandling.Ignore (ver aquí)
    • Gracias! Voy a echar un vistazo.

  2. 1

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

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

    Que debería para la mayoría de los casos. ¿Qué versión de WCF está en ejecución? Cualquier razón que usted está devolviendo un Mensaje de tipo más bien que el tipo real?

    • Es WCF4. En mi web.config, mi <standardEndpoint> ha defaultOutgoingResponseFormat=»Json», por lo que no tengo para decorar los métodos de servicio. Por el diseño de mi Entidades [IsReference=true] y no puede obtener serializado con el defecto de DataContractSerializer. Así que tengo que usar onther Serializador como Json.net que puede manejar Entidades con [IsReference= «true»]. Me estoy volviendo el tipo de Mensaje no consigo que mi respuesta serialzed dos veces, una vez por json.net y, a continuación, por DataContractSerializer. Si me devuelve el tipo de realidad que me llega no válido json como «{\»de la Ciudad de\»:\»el Cairo\»}» Gracias por tu respuesta.
    • Así que esto funciona para usted si usted no utiliza el IsReference atributo, pero usted tiene que utilizar el diseño por otra razón?
    • Correcto, IsReference es el único problema. Este es reportado en muchos posts DataContractJsonSerializer no se puede serializar entidades marcadas con IsReference=true. Es por eso que estoy buscando para utilizar otro Serializador. Muchas Gracias
    • El valor predeterminado JSON serializadores la falta de cualquier tipo de apoyo para la inclusión y la reactivación de tipo de información y preservación de las referencias a objetos y que permite la auto-referencia de bucles. JSON.NET maneja bien a través de la inclusión de $tipo, $id, y $ref propiedades.
    • DataContractJsonSerializer también tienen muy mala la serialización de DateTime.
  3. 0

    La definen en su web de servicio de configuración en el servicio de comportamientos:

    <endpointBehaviors>
       <behavior name="restfulBehavior">
          <webHttp defaultOutgoingResponseFormat="Json" defaultBodyStyle="Wrapped" automaticFormatSelectionEnabled="False" />
          <!--<enableWebScript />-->
       </behavior>
    </endpointBehaviors>

    o en su contrato de operación de la Interfaz

    [OperationContract]
    [WebInvoke(Method = "GET", 
               UriTemplate = "/advertisements/{app_id}/{access_token}/{genero}/{age}", 
               ResponseFormat = WebMessageFormat.Json,
               RequestFormat = WebMessageFormat.Json, 
               BodyStyle = WebMessageBodyStyle.Wrapped)]

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea