Como fazer logon pedido inputstream com HttpModule, em seguida, redefinir posição InputStream
-
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.
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