ではASP.NET MVC
、フォームの投稿データにアクセスできます。
var thisData = Request.Form["this.data"];
Web API
ApiControllerで同じ機能を実現することは可能ですか?
ではASP.NET MVC
、フォームの投稿データにアクセスできます。
var thisData = Request.Form["this.data"];
Web API
ApiControllerで同じ機能を実現することは可能ですか?
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"];
}
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"
};
}
}
しかし、これがこの種のことを行うための最良の方法であるかどうかはわかりません。
Aliostadの方法の代わりに、次のことができます。
public void Post(HttpRequestMessage request)
{
NameValueCollection formData = await request.Content.ReadAsFormDataAsync();
}
があれば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;
}
これを試して:
HttpContext.Current.Request.Form["key"];