0

ここで概説する理由により、各リクエストの前にクエリ文字列またはフォームデータから設定値を確認する必要があります(認証を実行できるようにするため)。キーは毎回同じであり、各リクエストに存在する必要がありますが、GETリクエストの場合はクエリ文字列に、POSTなどの場合はフォームデータに配置されます。

これは認証を目的としているため、リクエストの前に実行する必要があります。現在、MessageHandlerを使用しています。

メソッドに基づいてクエリ文字列とフォームデータのどちらを読み取る必要があるかを判断できます。GETの場合は、Request.GetQueryNameValuePairs()を使用してクエリ文字列を正常に読み取ることができます。ただし、問題は、POSTの場合にformdataを読み取ることです。

Request.Content.ReadAsFormDataAsync()を使用してformdataを取得できますが、formdataは1回しか読み取ることができず、ここで読み取ると、要求に使用できなくなります(つまり、コントローラーアクションはnullモデルを取得します)

リクエストロジックに到達する前に、リクエストからクエリ文字列やフォームデータを一貫して非侵入的に読み取るための最も適切な方法は何ですか?

4

3 に答える 3

1

どちらの場所が良いかという質問に関しては、この場合、AuthorizationFiltersはメッセージハンドラーよりも優れていると思いますが、どちらにしても、問題は本文を複数回読み取ることに関連していることがわかります。

メッセージハンドラで「Request.Content.ReadAsFormDataAsync()」を実行した後、次のことを試してみてください。

Stream requestBufferedStream = Request.Content.ReadAsStreamAsync().Result;
requestBufferedStream.Position = 0; //resetting to 0 as ReadAsFormDataAsync might have read the entire stream and position would be at the end of the stream causing no bytes to be read during parameter binding and you are seeing null values.

:リクエストのコンテンツを1回だけ、または複数回読み取ることができるかどうかは、ホストのバッファポリシーによって異なります。デフォルトでは、ホストのバッファポリシーは常にバッファリングされているように設定されています。この場合、位置を0にリセットすることができます。ただし、ポリシーを明示的にストリーミングするようにした場合、0にリセットすることはできません。

于 2013-02-24T00:41:34.350 に答える
0

ActionFilterAtrributesを使用するのはどうですか?

于 2013-02-24T00:54:42.073 に答える
0

このコードは私にとってうまくいきました

public HttpResponseMessage AddEditCheck(Check check)
{
    var request= ((System.Web.HttpContextWrapper)Request.Properties.ToList<KeyValuePair<string, object>>().First().Value).Request;

    var i = request.Form["txtCheckDate"];
    return Request.CreateResponse(HttpStatusCode.Ok);
}
于 2015-07-06T14:39:43.320 に答える