Ведение протокола HttpListener Response OutputStream во время отладки - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь получить каждый запрос и ответ моего HttpListener в журнале.

Для HttpListenerContext.Request.InputStream это было так просто, как сделать это:

var finfoIn = context.Request.GetType().GetField("m_RequestStream", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
context.Request.InputStream.CopyTo(memstreamIn);
memstreamIn.Seek(0, System.IO.SeekOrigin.Begin);
var reader = new System.IO.StreamReader(memstreamIn, Encoding.Unicode);
this.Log(reader.ReadToEnd()); //Actual log method that prints to console
memstreamIn.Seek(0, System.IO.SeekOrigin.Begin);
finfoIn.SetValue(context.Request, memstreamIn);

Однако из-задля HttpListenerContext.Response.OutputStream, имеющего тип поля (internal) System.Net.HttpResponseStream, описанный выше трюк невозможен.

У кого-нибудь есть какое-либо решение, позволяющее вести регистрацию для OutputStream?

1 Ответ

0 голосов
/ 25 сентября 2018

Вот очень простой пример для отладки:

HttpListener Listener = new HttpListener("http", 80);
Listener.Start();
HttpListenerContext ctx;
string s;
byte[] b;
int i;

while (true)
{
    ctx = Listener.GetContext();
    Debug.Print("Serving a page...");
    s = "";
    for (i = 0; i < 500; i++) s += "Hello!"; // a 5KB dumb page
    s += "";
    b = Encoding.UTF8.GetBytes(s);
    ctx.Response.ContentLength64 = b.Length;
    ctx.Response.ContentType = "text/html";
    ctx.Response.OutputStream.Write(b, 0, b.Length);
    ctx.Response.OutputStream.Close();           
    s = null;
    b = null;
    Debug.GC(true);
    Debug.Print("Done with the page.");    
}
...