Webapi met "Le dictionnaire de paramètres contient une entrée null pour le paramètre ..."

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

  •  09-12-2019
  •  | 
  •  

Question

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 Met en-tête:

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

Corps:

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

réponse:

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."

pourquoi?merci.

PS:

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

Était-ce utile?

La solution

Je suis incapable de reproduire le problème que vous décrivez.

Modèle:

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

Contrôleur:

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

Client:

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

Lorsque j'exécute le client, la demande suivante est en cours d'envoi:

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"}

et je reçois le résultat correct du serveur.Donc, je suppose que la demande que vous affichez n'est pas la demande réelle qui est envoyée au serveur.

Autres conseils

J'ai le même problème.Le paramètre de requête, "ID" est NULL et l'objet "Contact" est rempli. Je pense que c'est un problème de liaison modèle.Si vous mettez un point de rupture dans le contrôleur, regardez cette expression:

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

Vous verrez que la valeur est là dans les données de route;C'est juste ne pas se mettre sur le modèle.J'ai un facteur d'action et si je mets un point de pause là-bas également, je vois que l'actionArgument d'ActionContext a une clé pour cela, mais une valeur nulle.

Je suis toujours recherchée ...

Craigtadock, merci pour votre aide et envoie le bogue à Microsoft.J'avais le même problème avec les puts.Aucun d'entre eux n'a travaillé.En tant que solution de contournement, j'ai piraté le post pour manipuler.Si l'objet que je pose sur le serveur a déjà ID ID, le code postal traite-le comme mis avec cet identifiant.Pseudo code est:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top