web-dev-qa-db-fra.com

API Web ASP.NET - Aucun 'MediaTypeFormatter' n'est disponible pour lire un objet de type 'Int32'

Je ne suis pas tout à fait sûr de ce qui s'est passé ici. J'ai peut-être tout gâché quelque part, mais je ne sais pas quoi. 

Ma méthode de contrôleur API ressemble à ceci:

public HttpResponseMessage<string> Put(int id)

J'ai aussi essayé une chaîne avec la même erreur. 

Des idées?

Merci.

Editer: Pour être clair - l'id est le paramètre de route. Le corps de la demande est JSON. Si je supprime le paramètre route, la méthode fonctionne normalement.

16
Roberto Bonini

Veuillez lire le post suivant sur le blog:

Ceci décrit les problèmes les plus courants avec l’utilisation de paramètres simples. Sans connaître plus de détails sur l’apparence de votre demande, il n’est pas possible de déterminer celle que vous avez touchée.

METTRE &AGRAVE; JOUR

Il existe un autre bogue connu prenant en compte les valeurs de route. Dans le cas où aucun des formateurs intégrés n'est utilisé pour la demande POST/PUT/PATCH, les paramètres de valeurs d'itinéraire ne sont pas liés. Pour contourner ce problème, la meilleure solution consiste à écrire ActionFilterAttribute comme décrit ci-dessous:

7
tpeczek

Étonnamment, int et string n'ont pas de MediaTypeFormatter par défaut, de sorte qu'il ne sait pas comment gérer ces types. 

Les seuls types pris en charge sont JSON, XML et des données codées en URL. Cette citation provient du site officiel asp.net, http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters

Dans l'API Web, le type de support détermine la manière dont l'API Web se sérialise et désérialise le corps du message HTTP. Il existe un support intégré pour XML, JSON et les données codées par formulaire, et vous pouvez prendre en charge des supports supplémentaires les types en écrivant un formateur multimédia.

Vous pouvez maintenant écrire votre propre MediaTypeFormatter (le lien que je vous ai fourni vous montrera comment), mais comme l’API Web asp.net est toujours en version bêta, j’ai eu beaucoup de mal à utiliser des outils de formatage personnalisés pour les types simples comme les chaînes. J'ai trouvé qu'il est beaucoup plus facile d'envelopper la valeur que vous souhaitez mettre en XML/JSON et elle sera automatiquement désérialisée. Voir mon post ici pour plus d'informations à ce sujet, Lorsque HTTP-POST a un corps, le paramètre url est null

Pour votre exemple spécifique, votre corps PUT ressemblerait à ceci:

<message>
   <id>6</id>
</message>

Assurez-vous ensuite de définir le type de contenu de votre demande http sur text/xml (ou application/json si vous choisissez de l'utiliser). Et il devrait sérialiser très bien dans la variable.

13
Despertar

Placez-vous la valeur int dans le corps du message de requête? Si oui, quel est le format? 

Si le type de contenu est du texte, Web API ne saura pas quoi en faire, car elle ne fournit pas de formateur multimédia pour le texte. Vous pouvez écrire un formateur personnalisé, comme le note Despertar.

Vous pouvez aussi faire quelque chose comme ça:

public void Put()
{
    var s = Request.Content.ReadAsStringAsync().Result;
}
5
Mike Wasson

Sur une note de côté ... Je l'ai vu jeter cette erreur lorsque le service a commencé à exiger «HTTPS».

0
Prisoner ZERO

J'ai posté un DELETE avec un corps json et l'ai reçu. La publication avec des paramètres a résolu le problème.

0
Ken