27

ではASP.NET MVC、フォームの投稿データにアクセスできます。

var thisData = Request.Form["this.data"];

Web API ApiControllerで同じ機能を実現することは可能ですか?

4

5 に答える 5

36

ASP.NET Web APIは、さまざまなHTTPシナリオ(特にストリーミング)を処理する際に大幅に堅牢になりました。そのため、通常、メディアタイプのフォーマッターのみがコンテンツに触れ、コンテンツの一貫性を保つ必要があります。

ASP.NET MVCでは、application/x-www-form-urlencodedコンテンツタイプは第一級市民であり(これはPOST要求の95%のコンテンツタイプであるため特に扱われます)FormsCollection、入力パラメーターとして定義されている場合は常に、アクセス時に辞書アクセスを提供する必要があります。 。

ASP.NET Web APIでは、application/x-www-form-urlencodedはさらに別のコンテンツタイプであり、MediaTypeFormatterによって読み取られることになっています。そのため、ASP.NET Web APIは、について何も想定できませんForms

ASP.NET Web APIの通常のアプローチは、フォームをモデルとして表現し、メディアタイプフォーマッターがフォームを逆シリアル化することです。NameValueCollection別の方法は、アクションのパラメーターを次のように定義することです。

public void Post(NameValueCollection formData)
{
   var value = formData["key"];
}
于 2012-07-21T18:16:18.377 に答える
19

HttpRequestMessageまあ、箱から出してその種のコレクションを提供しないので、それは不可能です。

ただし、アプリケーションがASP.NETでホストされている場合は、現在のHttpContextオブジェクトにアクセスして、そこからフォームの値を取得できます。

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

しかし、これがこの種のことを行うための最良の方法であるかどうかはわかりません。

于 2012-07-21T18:16:31.883 に答える
5

Aliostadの方法の代わりに、次のことができます。

public void Post(HttpRequestMessage request)
{
    NameValueCollection formData = await request.Content.ReadAsFormDataAsync();
}
于 2016-06-16T11:16:18.817 に答える
1

があればHttpRequestMessage、いくつかのオプションがあります。

を参照することにより、拡張メソッドSystem.Net.Http.Formattingを使用できます。ReadAsFormDataAsync()

var formData = await message.Content.ReadAsFormDataAsync();

そのライブラリを含めたくない場合は、のHttpUtilityヘルパークラスを使用して同じことを手動で行うことができますSystem.Web

public async Task<NameValueCollection> ParseFormDataAsync(HttpRequestMessage message)
{
    string formString = await message.Content.ReadAsStringAsync();
    var formData = HttpUtility.ParseQueryString(formString);
    return formData;
}
于 2018-04-26T16:15:01.510 に答える
-1

これを試して:

HttpContext.Current.Request.Form["key"];
于 2017-08-04T13:54:05.687 に答える