HTTPリクエスト入力ストリームを2回読み取れないのはなぜですか? 質問する

HTTPリクエスト入力ストリームを2回読み取れないのはなぜですか? 質問する

いくつかのテストを行うためにデバッグ コードを挿入していたのですが、デバッグ コードが期待どおりに動作しませんでした。以下の例は、私の質問を説明するための簡略化されたコードです。

これは .NET 4 で、WebApi を使用して、デバッグ コードで http 要求の本文を出力しようとしています。これを行うには、入力ストリームをシークしてストリームを読み取ります。最初は正常に動作しますが、もう一度読み取ろうとすると、空の文字列が返されます。

なぜ InputStream をもう一度シークして読み取ることができないのでしょうか? 以下の例では、body2 は常に空です。2 番目のセットでは、CanSeek はまだ true であり、ReadToEnd() への 2 回目の呼び出しは、デフォルトを上書きする空の文字列を返します。

using System.IO;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;

public class TestController : ApiController
{

    public class TestOutuput
    {
        public string firstRead;
        public string secondRead;
    }

    public HttpResponseMessage Post()
    {
        string body1 = "default for one";
        string body2 = "default for two";
        if (HttpContext.Current.Request.InputStream.CanSeek)
        {
            HttpContext.Current.Request.InputStream.Seek(0, System.IO.SeekOrigin.Begin);
        }
        using (var reader = new StreamReader(HttpContext.Current.Request.InputStream))
        {
            body1 = reader.ReadToEnd();
        }

        if (HttpContext.Current.Request.InputStream.CanSeek)
        {
            HttpContext.Current.Request.InputStream.Seek(0, System.IO.SeekOrigin.Begin);
        }
        using (var reader2 = new StreamReader(HttpContext.Current.Request.InputStream))
        {
            // this is always empty, even after seek back to origin
            body2 = reader2.ReadToEnd();
        }

        TestOutuput testOutput = new TestOutuput() { firstRead = body1, secondRead = body2 };
        HttpResponseMessage response = new HttpResponseMessage();
        return Request.CreateResponse<TestOutuput>(HttpStatusCode.OK, testOutput);
    }
}

ベストアンサー1

StreamReader破棄時に指定されたストリームを呼び出しますDispose。ストリームを開いたままにするには、適切なコンストラクタ。あるいはStreamReader、バッファにコピーするだけでもよいでしょう。MSDN より:

ストリームから読み取る場合は、ストリームの内部バッファと同じサイズのバッファを使用する方が効率的です。

見るこの質問例えば。

おすすめ記事