Pourquoi ne puis-je pas lire deux fois le flux d'entrée de requête HTTP?

J'ai été mise dans un peu de débogage de code pour tester certaines choses, et puis le code de débogage ne se comportent pas comme prévu. L'exemple ci-dessous est une forme simplifiée de code pour illustrer ma question.

C'est dans .NET 4 et à l'aide de WebApi, je suis en train d'imprimer le corps de la requête http dans le code de débogage. Pour ce faire je cherche le flux d'Entrée arrière et lire le flux. Il fonctionne très bien la première fois, mais si j'essaie de le lire à nouveau, je reçois une chaîne vide.

Pourquoi ne puis-je pas de chercher en arrière et lire la InputStream une deuxième fois? Dans l'exemple ci-dessous, corps2 est toujours vide. Dans le deuxième set, CanSeek est encore vrai et le deuxième appel à ReadToEnd() retourne une chaîne vide en écrasant la valeur par défaut.

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);
    }
}

source d'informationauteur Michael Levy