web-dev-qa-db-fra.com

Existe-t-il un moyen de gérer les données de publication de formulaire dans un contrôleur Web Api?

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 APIApiController ?

25
Magnus Johansson

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"];
}
34
Aliostad

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.

18
tugberk

Comme alternative à la méthode d'Aliostad, on peut faire:

public void Post(HttpRequestMessage request)
{
    NameValueCollection formData = await request.Content.ReadAsFormDataAsync();
}
5
Philip Bergström

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