C#跟踪截断长消息

C#跟踪截断长消息,c#,C#,在C#中,我启用了跟踪和网络跟踪源 <?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <system.diagnostics> &l

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

    <?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <system.diagnostics>
    <sources>
      <source name="System.Net" tracemode="includehex" maxdatasize="1024">
        <listeners>
          <add name="System.Net"/>
        </listeners>
      </source>
    </sources>
    <switches>
      <add name="System.Net" value="Verbose"/>
    </switches>
    <sharedListeners>
      <add name="System.Net"
        type="TraceTest.StringWriterTraceListener, TraceTest"
        initializeData="myfile.log"
      />
    </sharedListeners>
    <trace autoflush="true" indentsize="4" />    
  </system.diagnostics>
</configuration>
这是一条消息,
TraceListener
上的
Write
方法被调用,其中单个消息作为被截断的参数(结尾的“…}.”

而且饼干写得很糟糕,几乎是不可分析的,但我可以接受


是的,遗憾的是,除了篡改System.dll或使用一些奇怪而复杂的类型继承之外,没有多少工作要做。

您将无法获得额外的数据

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

Logging.PrintInfo(Logging.Web, this, SR.GetString("net_log_received_headers", new object[]
    {
        this.m_ResponseData.m_ResponseHeaders.ToString(true)
    }));
内部密封的静态类
SR
和方法
GetString
是罪魁祸首。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;
}
无论您对它抛出什么,它都会重写参数,将其长度限制为1024个字符

当ResponseHeaders集合将其所有名称/值写入单个字符串时,一旦将其交给
SR.GetString
,所有的努力和内存都将被浪费

当日志记录涉及到
SR.GetString
时,您将面临数据被截断的风险。要知道在何处发生这种情况,唯一的方法是检查部件或部件

调用内部
日志记录
类的
转储
方法时,使用配置中的
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;
}

这不正是
maxdatasize
的用途吗?1024似乎有点低。考虑到这一点,尝试使用32768和20000,但显然不是为了这个,或者必须设置一些其他属性,但我找不到属性列表。奇怪的是,更大的网页html被输出为十六进制而没有被截断,但我还没有测试这是否发生在一条消息中。如果你只对webrequests感兴趣,为什么不使用它呢?我已经花了很大的精力来破解这个配置限制,而不是使用fiddler核心API。
if (text != null && text.Length > 1024)
{
    args[i] = text.Substring(0, 1021) + "...";
}
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;
}