.net - manager - tag analysis
Cómo registrar el flujo de entrada de solicitud con HttpModule y luego restablecer la posición de InputStream (6)
Estoy intentando registrar el contenido de una solicitud http, usando un IHttpModule así:
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)
}
}
El problema es que, después de leer el flujo de entrada hasta el final, parece que InputStream ha desaparecido o es más probable que el cursor esté al final del flujo.
He intentado request.InputStream.Position = 0;
y request.InputStream.Seek(0, SeekOrigin.Begin);
pero tampoco trabajo.
En algún momento, RequestFilter
no se ejecuta con el método Read. Parece que W3WP no lee el contenido de httprequest
de forma normal.
Si implementa WEbservice
al servidor. Luego usa IHttpModule para atraparlo. Añadir RequestFilter
.
Pero el método Read()
de RequestFilter no se ejecuta: P
Es necesario utilizar un filtro de solicitud . Escriba una clase derivada de Stream y regístrela como un filtro.
Esta respuesta no funcionó. devuelve una matriz que contiene 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 la corriente de entrada consumida.
He resuelto el problema: creo que las llamadas a disposición en StreamReader también deben estar matando a InputStream.
En lugar de usar el StreamReader hice lo siguiente:
var bytes = new byte[request.InputStream.Length];
request.InputStream.Read(bytes, 0, bytes.Length);
request.InputStream.Position = 0;
string content = Encoding.ASCII.GetString(bytes);
Así que el 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)
}
}
Sí, el StreamReader cerrará la secuencia suministrada.
Si está en> v4.5, use un constructor StreamReader que deje la secuencia abierta.
using (var reader = new StreamReader(request.InputStream, Encoding.UTF8, true, 1024, true))
{
content = reader.ReadToEnd();
}
Tuve que hacer un pequeño pellizco a la respuesta proporcionada por "cbp". Al usar su código acabo de tener ceros. Me moví estableciendo la posición a 0 por encima de la lectura y ahora 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);