2012-06-29 20 views
17

La actualización de ASP.NET WebAPI Beta a RC ha proporcionado cierta cantidad de emoción y una gran frustración. He podido resolver la mayoría de los problemas, pero el que me está afectando en este momento es la sensibilidad a mayúsculas y minúsculas de los datos de solicitud de JSON.ASP.NET WebAPI JSON Binding Case-Sensitivity

El formateador utilizado para las solicitudes JSON (que de forma predeterminada es un formateador JSON.NET) parece ser sensible a mayúsculas y minúsculas, mientras que el formateador utilizado para los datos de urlencoded no lo hace. ¿Hay alguna manera de configurar las solicitudes JSON para usar un formateador insensible a mayúsculas y minúsculas?

Aquí está un ejemplo simple para ilustrar el problema que estoy teniendo con las peticiones JSON:

HTML/JavaScript

<button id="tester">Click here!</button> 

<script type="text/javascript"> 
    $(function() { 
     $("#tester").on("click", function() { 
      $.ajax({ 
       type: "POST", 
       url: "/Api/Test/Index/" + 168, 
       data: ko.toJSON({ key: 123, value: "test value" }), // THIS FAILS 
           // Key: 123, Value: "test value" <- BUT THIS WORKS 
       contentType: "application/json; charset=utf-8", 
       statusCode: { 
        200: function() { 
         $("body").append("<p>Success</p>"); 
        }, 
        400: function() { 
         $("body").append("<p>Failure</p>"); 
        } 
       } 
      }).always(function() { 
       $("body").append("<hr />"); 
      }); 
     }); 
    }); 
</script> 

C#

public class TestController : ApiController 
{ 
    public HttpResponseMessage Index(int? id, KeyValuePair<int, string> test) 
    { 
     if (id != 168 || test.Key != 123 || test.Value != "test value") 
      return Request.CreateResponse(HttpStatusCode.BadRequest); 

     return Request.CreateResponse(HttpStatusCode.OK); 
    } 
} 

tengo proporcionó un comentario en la línea donde se proporcionan los datos JSON. Prefiero no romper la convención con mis objetos de JavaScript por los miembros de la propiedad de la carcasa adecuada y ciertamente no quiero romper la convención por una carcasa inferior de mis propiedades de C#. ¿Alguna idea?

+0

estoy un poco confundido aquí. Envía sus datos dentro de una solicitud POST, es decir, dentro de un cuerpo de solicitud. Pero en la documentación de HTTP se dice que los campos de encabezado (y los valores) se consideran insensibles a las mayúsculas y minúsculas, y no hay nada sobre el cuerpo ... ¿Por qué crees que "no es el comportamiento de los datos en formato urlencoded", me pregunto? – raina77ow

+0

Consulte [esta discusión] (http://groups.google.com/group/soundcloudapi/browse_thread/thread/c266c0d2efa88fbb/9ad3969dde919cba), por ejemplo. – raina77ow

+1

@ raina77ow Esto no es realmente una pregunta acerca de la especificación HTTP sino del comportamiento del formateador JSON.NET utilizado por ASP.NET WebAPI RC. El formateador FormUrl parece no distinguir entre mayúsculas y minúsculas, mientras que el formateador JSON.NET * es * sensible a mayúsculas y minúsculas. –

Respuesta

6

Después de la excavación en este asunto en profundidad significativa Me di cuenta de que me estaba pegando un error en el convertidor de Json.NET KeyValuePair. James Newton-Rey tuvo la amabilidad de responder a mi pregunta relacionada y proporciona un enlace a la revisión:

Json.NET Case-insensitive Property Deserialization

24

El formateador Json.NET no distingue entre mayúsculas y minúsculas para la deserialización (json -> CLR).

En la serialización, puede obtener una carcasa camel usando el CamelCasePropertyNamesContractResolver.

En su Global.asax:

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; 
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
+0

Creo que este es el caso, pero no he podido demostrar ese comportamiento. Por favor vea mi pregunta relacionada: http://stackoverflow.com/questions/11266695/json-net-case-insensitive-property-deserialization –

+0

Hmm ... Acabo de experimentar con JsonConvert. La deserialización de KeyValuePair distingue entre mayúsculas y minúsculas, como dices, pero si creo un POCO, el comportamiento definitivamente no distingue entre mayúsculas y minúsculas. Parece estar relacionado con KeyValuePair con getters pero sin setters, porque definí mi propia versión de KeyValuePair con setters y eso funcionó. –

+0

Ah, es posible que tenga algo ... Haré más experimentos y veré si puedo determinar cómo se deserializa con las teclas en mayúsculas coincidentes. ¡Gracias! –

Cuestiones relacionadas