WEBAPI PUT "El diccionario de los parámetros contiene una entrada nula para el parámetro ..."

StackOverflow https://stackoverflow.com//questions/9621255

  •  09-12-2019
  •  | 
  •  

Pregunta

public class ContactsController : ApiController
{
    private static readonly List<Contact> _contacts = new List<Contact>();
    public Contact PutContacts(int id, Contact contact)
    {
        if (_contacts.Any(c => c.Id == contact.Id) == false)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        contact.LastModified = DateTime.Now;
        return contact;
    }
}

HTTP PUT HEADER:

PUT /api/contacts/3 HTTP/1.1
User-Agent: Fiddler
Content-Type: application/json
Host: localhost:8080

Cuerpo:

{"Id":3,"Name":"mmm","Phone":"000 000 0000","Email":"mmm@gmail.com","LastModified":"2012-03-08T23:42:13.8681395+08:00"}

Respuesta:

HTTP/1.1 400 Bad Request
"The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'SelfHost.Contact PutContacts(Int32, SelfHost.Contact)' in 'SelfHost.ContactsController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter."

¿Por qué?gracias.

PS:

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

¿Fue útil?

Solución

No puedo reproducir el problema que está describiendo.

Modelo:

public class Contact
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Phone { get; set; }
    public string Email { get; set; }
    public DateTime LastModified { get; set; }
}

controlador:

public class ContactsController : ApiController
{
    public Contact Put(int id, Contact contact)
    {
        return contact;
    }
}

Cliente:

class Program
{
    static void Main()
    {
        using (var client = new WebClient())
        {
            client.Headers[HttpRequestHeader.ContentType] = "application/json";
            var data = Encoding.UTF8.GetBytes(@"{""Id"":3,""Name"":""mmm"",""Phone"":""000 000 0000"",""Email"":""mmm@gmail.com"",""LastModified"":""2012-03-08T23:42:13.8681395+08:00""}");
            var result = client.UploadData("http://localhost:1405/api/contacts/4", "PUT", data);
            Console.WriteLine(Encoding.UTF8.GetString(result));
        }
    }
}

Cuando ejecuto el cliente, se está enviando la siguiente solicitud:

PUT /api/contacts/4 HTTP/1.1
Content-Type: application/json
Host: localhost:1405
Content-Length: 119
Expect: 100-continue
Connection: Keep-Alive

{"Id":3,"Name":"mmm","Phone":"000 000 0000","Email":"mmm@gmail.com","LastModified":"2012-03-08T23:42:13.8681395+08:00"}

y obtengo el resultado correcto del servidor.Así que supongo que la solicitud que está mostrando no es la solicitud real que se está enviando al servidor.

Otros consejos

Estoy teniendo este mismo problema.El parámetro de consulta, "ID" es NULL y el objeto "Contacto" se completa. Creo que este es un problema de encuadernación modelo.Si pone un punto de descanso en el controlador, mire esta expresión:

this.ControllerContext.RouteData.Values["id"]

Verá que el valor está allí en los datos de ruta;Simplemente no se está poniendo en el modelo.Tengo un filtro de acción y, si pongo un punto de descanso, veo que elgument de ActionContext tiene una clave para ello, pero un valor nulo.

todavía estoy investigando ...

craigtadlock, gracias por su ayuda y enviando el error a Microsoft.Estaba teniendo el mismo problema con las puts.Ninguno de ellos funcionó.Como solución alternativa, hackeé post para manejar.Si el objeto que estoy publicando en el servidor ya tiene su ID, el código postal lo trata como un puesto con esa identificación.El código pseudo es:

public HttpResponseMessage<MyClass> PostMyClass(MyClass myObject)
{
    if( myObject.ID != 0 ){
         //do PUT code
    }else{
         //do POST code
    }
}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top