Como fazer logon pedido inputstream com HttpModule, em seguida, redefinir posição InputStream

StackOverflow https://stackoverflow.com/questions/1678846

  •  16-09-2019
  •  | 
  •  

Pergunta

Eu estou tentando registrar o conteúdo de uma solicitação HTTP, usando um IHttpModule assim:

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

O problema é que depois de ler o fluxo de entrada para o fim, o InputStream parece ter ou desapareceu ou, mais provavelmente, o cursor estiver no fim do fluxo.

Eu tentei request.InputStream.Position = 0; e request.InputStream.Seek(0, SeekOrigin.Begin); mas nem trabalho.

Foi útil?

Solução

Eu tenho trabalhado para fora o problema:. Eu acho que chamar dispor sobre o StreamReader deve ser matando o InputStream demasiado

Em vez de usar o StreamReader eu fiz o seguinte:

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

Assim, o código completo:

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

Outras dicas

Sim, o StreamReader vai fechar o fluxo fornecido.

Se você estiver em> v4.5, use um construtor StreamReader que deixa o open stream.

using (var reader = new StreamReader(request.InputStream, Encoding.UTF8, true, 1024, true))
{
    content = reader.ReadToEnd();
}

Eu tive que fazer um pequeno ajuste para a resposta fornecida pelo "PFC". Ao usar seu código Acabei zeros. Mudei-me definir a posição a 0 acima da leitura e agora ele funciona.

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

Você precisa usar um href="http://msdn.microsoft.com/en-us/library/system.web.httprequest.filter.aspx" rel="nofollow noreferrer"> filtro pedido . Escreva uma classe que deriva de Fluxo e registrá-lo como um filtro.

Esta resposta não funcionou. ele retorna uma matriz que contém valores nulos.

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

porque o fluxo de entrada consumido.

em algum momento, RequestFilter não correr para o método Read. Ele parece ser W3WP não ler o conteúdo de httprequest por meio normal.

Se você implantar WEbservice ao servidor. Em seguida, use IHttpModule para pegá-lo. Adicionar RequestFilter.

Mas o método Read() de RequestFilter não executar: P

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top