Dans ASP.NET MVC
, on peut accéder aux données de publication du formulaire:
var thisData = Request.Form["this.data"];
Est-il possible d'obtenir la même fonctionnalité dans un Web API
ApiController ?
L'API Web ASP.NET est devenue beaucoup plus robuste pour traiter différents scénarios HTTP, notamment le streaming. En tant que tels, seuls les formateurs de type de média touchent normalement le contenu et doivent en assurer la cohérence.
Dans ASP.NET MVC, le type de contenu application/x-www-form-urlencoded
est un citoyen de première classe (et traité d'autant plus qu'il s'agit du type de contenu représentant 95% des demandes POST) et que nous avons la FormsCollection
pour fournir un accès par dictionnaire à chaque accès. est défini en tant que paramètre d'entrée.
Dans l’API Web ASP.NET, application/x-www-form-urlencoded
est un autre type de contenu, censé être lu par son MediaTypeFormatter. En tant que tel, l’API Web ASP.NET ne peut émettre aucune hypothèse concernant la variable Forms
.
L'approche normale dans l'API Web ASP.NET consiste à représenter le formulaire en tant que modèle afin que le formateur de type de support le désérialise. La solution consiste à définir le paramètre des actions comme suit: NameValueCollection
:
public void Post(NameValueCollection formData)
{
var value = formData["key"];
}
Eh bien, ce n’est pas possible, car HttpRequestMessage
ne fournit pas ce type de collection à l’origine.
Toutefois, si votre application est hébergée sous ASP.NET, vous pouvez accéder à l'objet HttpContext
actuel et obtenir les valeurs de formulaire à partir de cet emplacement:
public class CarsController : ApiController {
public string[] Get() {
var httpContext = (HttpContextWrapper)Request.Properties["MS_HttpContext"];
var foo = httpContext.Request.Form["Foo"];
return new string[] {
"Car 1",
"Car 2",
"Car 3"
};
}
}
Mais je ne suis pas sûr que ce soit la meilleure façon de faire ce genre de choses.
Comme alternative à la méthode d'Aliostad, on peut faire:
public void Post(HttpRequestMessage request)
{
NameValueCollection formData = await request.Content.ReadAsFormDataAsync();
}
Si vous avez juste une HttpRequestMessage
, vous avez deux options:
En référençant System.Net.Http.Formatting
, vous pouvez utiliser la méthode ReadAsFormDataAsync()
extension.
var formData = await message.Content.ReadAsFormDataAsync();
Si vous ne voulez pas inclure cette bibliothèque, vous pouvez faire la même chose manuellement en utilisant la classe auxiliaire HttpUtility
dans System.Web
.
public async Task<NameValueCollection> ParseFormDataAsync(HttpRequestMessage message)
{
string formString = await message.Content.ReadAsStringAsync();
var formData = HttpUtility.ParseQueryString(formString);
return formData;
}