【问题标题】:Logging HttpListener Response OutputStream during debug在调试期间记录 HttpListener 响应 OutputStream
【发布时间】:2019-02-28 22:09:34
【问题描述】:

我尝试记录我的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

【问题讨论】:

  • 你为什么要这样做?您是否需要在最终应用程序中进行此日志记录?您知道可以配置跟踪以输出所有网络数据吗?另外,为什么你认为这个技巧对于输出流是不可能的?
  • 最终应用中不需要这种日志记录。仅用于在开发(和测试)@CodeCaster 期间进行调试(它包含在 #if DEBUG 中)
  • 问题在于,如果我理解正确,它只会出现在例如的输出窗口中。视觉工作室或我选择的文件内部。但是,我需要它来运行 log 方法(因为它为我添加了一些更重要的调试信息以实际遵循这些请求),这就是我采用这种方法的原因。
  • 那么,如果您对 OutputStream 尝试相同的方法会发生什么?真正的问题是什么?

标签: c# reflection outputstream httplistener


【解决方案1】:

这是一个非常简单的调试示例:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    相关资源
    最近更新 更多