2012-05-08 11 views
5

Soy un novato de la API web que redacta un servicio RESTFul Web Api en .Net 4. He configurado un controlador para una clase a la que llamo Authentication. El problema que tengo es que cuando publico o pongo datos JSON en el servicio de API web, se llaman mis controladores en el controlador, pero los objetos de los parámetros tienen datos NULL en ellos. Puedo obtener datos con éxito, pero Publicar y Poner vienen con objetos de parámetros vacíos..NET 4 Web API que recibe datos NULL en los parámetros

He probado desde una aplicación cliente y Fiddler, y obtengo el mismo resultado. Esto es lo que estoy enviando desde Fiddler:

Action: PUT 
URI: http://127.0.0.1:81/Authentication/xyz/ 
HTTP Version: HTTP/1.1 
Request Headers: 
User-Agent: Fiddler 
Host: 127.0.0.1:81 
Content-Type: application/json; charset=utf-8 
Content-Length: 75 
Request Body: 
{"hashvalue":"kbVFNeBbNHmYQXXlS6d7Ag==","password":"test","username":"dan"} 

Cuando me puse un punto de interrupción en el controlador Poner en el controlador de autenticación:

public void Put(string IDstring, Authentication value) 
    { 

    } 

me sale el siguiente en la ventana de inspección:

IDstring     null string 
value {bbsRESTResources.Authentication} bbsRESTResources.Authentication 
    hashvalue null string 
    password null string 
    username null string 

mi clase de autenticación es el siguiente:

namespace bbsRESTResources 
{ 
    public class Authentication 
    { 
     public string username; 
     public string password; 
     public string hashvalue; 
    } 
} 

mi ruta se ve así:

 routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

Por favor, no se preocupe por si es o no es una buena manera de manejar la autenticación. Este es solo el primer paso para probar mi aplicación de extremo a extremo. He buscado ejemplos de otras personas con este problema y no he encontrado ninguno.

Respuesta

0

y definir como método

public void Put(Authentication value) 
{ 

} 
+0

Limpié mi ruta para enviar {username} y cambié la declaración del método a: public void Put (string username, Authentication value). Ahora obtengo el nombre de usuario correctamente, pero el valor sigue siendo un objeto de Autenticación con todos los valores nulos para los miembros. El controlador de publicación se codifica como se publicó (pero se llamó publicación) y también devuelve valores nulos para los miembros del objeto de autenticación. – Dan

6

Resulta que el ligante modelo sólo funciona en propiedades, no campos. Como resultado, tuve que hacer las propiedades de los miembros individuales de la clase Authentication. Cuando cambié mi definición de la clase de autenticación a la siguiente, funciona:

public class Authentication 
{ 
    public string hashvalue {get; set;} 
    public string password { get; set; } 
    public string username { get; set; } 
} 
+3

También, como una nota de un punto de fricción que tuve con respecto a otro problema que puede causar el mismo problema. Asegúrese de que la línea de tipo de contenido es "Content-Type: application/json; charset = utf-8" –

2

que tenía un problema similar (objetos de parámetros eran nulas), causa diferente. Marqué mi modelo como Serializable y, por algún motivo, el enlace del modelo no funcionó cuando lo hice. Una vez que eliminé el atributo, el enlace funcionó de nuevo.

+0

Esto es muy extraño, tengo un problema similar al que se describe en la pregunta, y la eliminación del atributo Serializable ayudó! ¡Gracias! –

Cuestiones relacionadas