224 votes

Paramètre de publication est toujours null

Depuis la mise à jour RC pour WebAPI, je vais avoir un peu de réel impair problème lors de l'appel de POST sur mon WebAPI. J'ai même repris la version de base généré sur un nouveau projet. Donc:

public void Post(string value)
{
}

et l'appel de Fiddler:

Header:
User-Agent: Fiddler
Host: localhost:60725
Content-Type: application/json
Content-Length: 29

Body:
{
    "value": "test"
}

Quand je debug, la "chaîne de valeur" est de ne jamais être attribué. C'est juste toujours NULL. Toute personne ayant ce problème?

(J'ai d'abord vu le problème avec un type complexe)

Le problème n'est pas seulement lié à ASP.NET MVC 4, le même problème se produit pour une nouvelle ASP.NET MVC 3 du projet après le RC installation

123voto

adrian cooper Points 60

J'ai été de me gratter la tête au-dessus de cela aujourd'hui.

Ma solution est de changer le [FromBody] pour une HttpRequestMessage, essentiellement vers le haut de la pile http.

Dans mon cas, je suis d'envoyer des données à travers le fil qui est zippé json qui est alors en base64. Tout cela à partir d'une application pour android.

L'original de la signature de mon point de terminaison ressemblait à ça (à l'aide de [FromBody]) :

My original endpoint

Mon correctif de ce problème a été de revenir à l'utilisation d'un HttpRequestMessage pour la signature de mon point de terminaison.

enter image description here

Vous pouvez ensuite accéder au poste de données à l'aide de cette ligne de code:

enter image description here

Cela fonctionne et vous permet d'accéder à la crue intacte données post. Vous n'avez pas de déconner avec le violoneux de mettre un signe = au début de votre chaîne ou de changer le type de contenu.

En aparté, j'ai d'abord essayé à la suite de l'une des réponses ci-dessus qui est de changer le type de contenu: "Content-Type: application/x-www-form-urlencoded". Pour les données brutes que c'est un mauvais conseil, car il supprime + caractères.

Donc en base64, chaîne qui commence comme ceci: "MQ0AAB+LCAAAAAA" se termine comme ça "MQ0AAB LCAAAAAA"! Pas ce que vous voulez.

Un autre avantage de l'utilisation de HttpRequestMessage est que vous obtenez l'accès à tous les en-têtes http de l'intérieur de votre point de terminaison.

111voto

Jim Harte Points 1338

Puisque vous avez seulement un paramètre, vous pouvez essayer de la décorant avec l' [FromBody] attribut, ou de modifier la méthode d'accepter un DTO avec la valeur d'une propriété, comme je l'ai suggéré ici: MVC4 RC WebApi liaison de paramètre

Mise à JOUR: L'officiel ASP.NET le site a été mis à jour aujourd'hui avec une excellente explication: http://www.asp.net/web-api/overview/working-with-http/sending-html-form-data,-partie-1

En un mot, lors de l'envoi d'un seul type simple dans le corps, envoyer la valeur préfixée par un signe égal (=), par exemple le corps:

=test

74voto

Kirk Broadhurst Points 13093

Je viens d’avoir cela se produire à l’aide d’un violon. Le problème était que je n’avais pas spécifié `` .

Essayez notamment un en-tête pour `` dans votre requête POST.

61voto

George Points 364

J’ai tombé sur ce problème aussi bien, et c’est comment j’ai résolu mon problème

code WebAPI :

code client :

19voto

Despertar Points 5365

Essayez de créer une classe pour servir le modèle de données, envoyez-lui un objet JSON avec les propriétés correspondent aux propriétés de votre modèle de données de la classe. (Note: j'ai testé et ça marche avec le nouveau MVC 4 RC 2012 que je viens de télécharger aujourd'hui).

public HttpResponseMessage Post(ValueModel model)
{
    return Request.CreateResponse<string>(HttpStatusCode.OK, "Value Recieved: " + model.Value);
}

public class ValueModel
{
    public string Value { get; set; }
}

Ci-dessous l'objet JSON est envoyé en HTTP-POST du corps, le type de contenu application/json

{ "value": "In MVC4 Beta you could map to simple types like string, but testing with RC 2012 I have only been able to map to DataModels and only JSON (application/json) and url-encoded (application/x-www-form-urlencoded body formats have worked. XML is not working for some reason" }

Je crois que la raison pourquoi vous devez créer un modèle de données de la classe est parce que de simples valeurs sont supposées être à partir de l'url des paramètres, et un seul complexe de la valeur est supposée être de l'organisme. Ils ont l' [FromBody] et [FromUrl] de leurs attributs, mais à l'aide de [FromBody] string value n'a toujours pas de travail pour moi. Semble qu'ils sont encore à un grand nombre de bugs, donc je suis sûr que cela va changer dans l'avenir.

Edit: Obtenu XML de travail dans le corps. La valeur par défaut de sérialiseur XML a été changé pour DataContractSerializer au lieu de XmlSerializer. Mettre la ligne suivante dans mon Global.asax fichier résolu ce problème (de référence)

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X