33

次のように IHttpModule を使用して、http 要求の内容をログに記録しようとしています。

public class LoggingModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.BeginRequest += ContextBeginRequest;
    }

    private void ContextBeginRequest(object sender, EventArgs e)
    {
        var request = ((HttpApplication)sender).Request;
        string content;

        using (var reader = new StreamReader(request.InputStream))
        {
            content = reader.ReadToEnd();
        }

        LogRequest(content)
    }
}

問題は、入力ストリームを最後まで読み取った後、InputStream が消えたか、カーソルがストリームの最後にある可能性が高いことです。

私は試しrequest.InputStream.Position = 0;ましrequest.InputStream.Seek(0, SeekOrigin.Begin);たが、どちらも機能しません。

4

6 に答える 6

46

私は問題を解決しました: StreamReader で dispose を呼び出すと、InputStream も強制終了されているに違いないと思います。

StreamReader を使用する代わりに、次のことを行いました。

        var bytes = new byte[request.InputStream.Length];
        request.InputStream.Read(bytes, 0, bytes.Length);
        request.InputStream.Position = 0;
        string content = Encoding.ASCII.GetString(bytes);

したがって、完全なコードは次のとおりです。

public class LoggingModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.BeginRequest += ContextBeginRequest;
    }

    private void ContextBeginRequest(object sender, EventArgs e)
    {
        var request = ((HttpApplication)sender).Request;

        var bytes = new byte[request.InputStream.Length];
        request.InputStream.Read(bytes, 0, bytes.Length);
        request.InputStream.Position = 0;
        string content = Encoding.ASCII.GetString(bytes);

        LogRequest(content)
    }
}
于 2009-11-05T07:25:48.343 に答える
23

はい、StreamReader は提供されたストリームを閉じます。

>v4.5 を使用している場合は、ストリームを開いたままにする StreamReader コンストラクターを使用します。

using (var reader = new StreamReader(request.InputStream, Encoding.UTF8, true, 1024, true))
{
    content = reader.ReadToEnd();
}
于 2013-11-29T01:50:46.927 に答える
2

この答えはうまくいきませんでした。null 値を含む配列を返します。

        var バイト = 新しいバイト [request.InputStream.Length];
        request.InputStream.Read(bytes, 0, bytes.Length);
        request.InputStream.Position = 0;
        文字列コンテンツ = Encoding.ASCII.GetString(バイト);

入力ストリームが消費されるためです。

于 2010-01-26T15:28:27.960 に答える
1

リクエスト フィルタを使用する必要があります。Streamから派生したクラスを作成し、フィルターとして登録します。

于 2009-11-05T07:20:33.440 に答える
-1

場合によっては、RequestFilterメソッド Read に実行しないでください。W3WP はhttprequest通常の方法でコンテンツを読み取らないようです。

WEbserviceサーバーにデプロイする場合。次に、IHttpModule を使用してキャッチします。を追加しRequestFilterます。

しかしRead()、RequestFilter のメソッドは実行されません :P

于 2012-06-27T07:42:42.500 に答える