C#跟踪截断长消息

在C#中,我启用了跟踪和网络跟踪源。

                      

但是更长的消息被截断(长度像12Kb / 30行,不长就像1GB!)所以我最终会遇到只记录部分web reqiest标题的情况。

如何解决?

或者您是否知道一本书或某些资源可以非常详细地解释.Net跟踪和调试?

日志示例:

  System.Net Information: 0 : [1204] Connection#63291458 - Received headers { Transfer-Encoding: chunked Connection: keep-alive Keep-Alive: timeout=10 Content-Type: text/html; charset=windows-1251 Date: Mon, 04 Jul 2016 17:50:33 GMT Set-Cookie: uid=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0,uid=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/,uid=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; domain=.zamunda.net,pass=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0,pass=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/,pass=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; domain=.zamunda.net,bitbucketz=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0,bitbucketz=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/,bitbucketz=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; domain=.zamunda.net,cats=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0,cats=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/,cats=deleted; expires=...}. 

这是一条消息,在某种程度上, TraceListener上的Write方法被称为whit,单个消息作为被截断的参数(最后的“…}。”)

cookies写得非常糟糕,几乎无法解决,但我可以忍受……

是的,遗憾的是,除了篡改System.dlls或使用一些奇怪和复杂的类型inheritance之外,没有太多工作要做。

你不会得到额外的数据。

您的典型示例来自名为ParseResponseData的私有方法,该方法调用此方法:

 Logging.PrintInfo(Logging.Web, this, SR.GetString("net_log_received_headers", new object[] { this.m_ResponseData.m_ResponseHeaders.ToString(true) })); 

带有GetString方法的内部密封静态类SR是罪魁祸首。 net_log_received_headers资源字符串是Received headers {{{0}}}。 。 ILSpy揭示了这段代码:

 public static string GetString(string name, params object[] args) { SR sR = SR.GetLoader(); if (sR == null) { return null; } string @string = sR.resources.GetString(name, SR.Culture); if (args != null && args.Length != 0) { for (int i = 0; i < args.Length; i++) { string text = args[i] as string; if (text != null && text.Length > 1024) { args[i] = text.Substring(0, 1021) + "..."; } } return string.Format(CultureInfo.CurrentCulture, @string, args); } return @string; } 

你注意到这件作品:

 if (text != null && text.Length > 1024) { args[i] = text.Substring(0, 1021) + "..."; } 

无论你抛出什么,它都会重写参数,将其长度限制为1024个字符。

当ResponseHeaders集合将其所有名称/值写入单个字符串时,一旦将其传递给SR.GetString ,就会浪费所有这些努力和内存。

SR.GetString参与日志记录时,您将面临数据被截断的风险。 了解发生位置的唯一方法是检查程序集或.Net参考源

调用内部Logging类的Dump方法时,将使用配置中的maxdatasize设置。 但是,您不必猜测数据是否被截断,因为它会在日志文件中告诉您:

 int maxDumpSizeSetting = Logging.GetMaxDumpSizeSetting(traceSource); if (length > maxDumpSizeSetting) { Logging.PrintLine(traceSource, TraceEventType.Verbose, 0, string.Concat(new string[] { "(printing ", maxDumpSizeSetting.ToString(NumberFormatInfo.InvariantInfo), " out of ", length.ToString(NumberFormatInfo.InvariantInfo), ")" })); length = maxDumpSizeSetting; }