10
public static class HttpRequestHelper
{
    public static string RequestBody()
    {
        var bodyStream = new StreamReader(HttpContext.Current.Request.InputStream);
        bodyStream.BaseStream.Seek(0, SeekOrigin.Begin);
        var bodyText = bodyStream.ReadToEnd();
        return bodyText;
    }
}

これを ActionFilters から呼び出して、着信要求をログに記録する予定です。もちろん、複数の同時リクエストが存在する可能性があります。

このアプローチは大丈夫ですか?

4

2 に答える 2

8

同時実行または ASP.NET Web API 一般の観点からの質問ですか? すべてのリクエストには独自のコンテキストがあり、複数のリクエストが並行して行われても問題ありません。しかし、ここで注目すべき点が 2 つあります。

(1) を使用しているためHttpContext、多くの場合は問題ない Web ホスティング (IIS) にロックされています。しかし、このことを知っておいていただきたいと思います。

HttpRequestHelper.RequestBody()(2)あなたが言及したように、アクションフィルターから呼び出されたときにコードが機能します。ただし、これを他の場所 (メッセージ ハンドラーなど) から呼び出そうとすると、これは機能しません。これがうまくいかないと言うと、リクエストボディをアクションメソッドのパラメーターにバインドするパラメーターバインディングがうまくいきません。完了したら、最初までシークする必要があります。アクション フィルターから機能する理由は、アクション フィルターがパイプラインで実行されるまでにバインドが既に行われているためです。これは、知っておく必要があるかもしれないもう 1 つのことです。

于 2013-09-05T00:21:28.657 に答える