C# 如何防止XmlWriterTraceListener在消息中使用xml编码字符
我正在尝试使用System.Diagnostics.XmlWriterTraceListener登录到本地文件。我首先创建一个源并向其中添加一个新的XmlWriterTraceListener,如下所示:C# 如何防止XmlWriterTraceListener在消息中使用xml编码字符,c#,xml,tracelistener,xml-encoding,C#,Xml,Tracelistener,Xml Encoding,我正在尝试使用System.Diagnostics.XmlWriterTraceListener登录到本地文件。我首先创建一个源并向其中添加一个新的XmlWriterTraceListener,如下所示: public class Logger { const string LOG_ERR_FMT = "<message><![CDATA[{0}]]></message>{2}"; TraceSource tSource = new Trac
public class Logger
{
const string LOG_ERR_FMT = "<message><![CDATA[{0}]]></message>{2}";
TraceSource tSource = new TraceSource(
"MyApp",
SourceLevels.Verbose | SourceLevels.ActivityTracing
);
public Logger() {
tSource.Listeners.Add(
new XmlWriterTraceListener("C:\\app_path\\app_tracelog.svclog", "LocalListener")
);
}
public static Logger defLogger = new Logger();
public static Logger Default {
get {return defLogger; }
set { if (value != null) defLogger = value; }
}
public void LogError(string msg, string extraXmlData) {
tSource.TraceEvent(TraceEventType.Error, 0, LOG_ERR_FMT, logMsg, extraXmlData);
}
}
在我打开app_tracelog.svclog之前一切都很好。首先,当我尝试使用Microsoft Service Trace Viewer打开它时,该程序的行为就像它是空的一样,并向我显示一条消息,表示没有从该文件加载任何跟踪
第二,我用旧的记事本++打开文件,发现我的应用程序确实登录到了它。我选择all并告诉XmlTools对其进行整理,而该工具告诉我它无法进行整理,因为XML中存在错误
所以,我开始手动格式化它。开始一切都很顺利,直到我看到我记录的实际应用程序消息。在这里,我发现这个愚蠢的@$类用编码的XML/HTML实体替换括号之类的东西,把我所有的嵌套XML都搞糟了
我所有的s都变成了,等等。。。因此,日志消息应该如下所示:
<message><![CDATA[Error parsing response from web service "someservice.com".]]></message><RequestBody...
所以最大的问题是:当我登录时,如何强制XmlWriterTraceListener停止破坏我的消息?当我输入特殊的XML字符时,我知道我在做什么,而且它认为它知道得更好-或者-是否有另一个侦听器类以我想要的方式登录到本地XML文件?应该能够将任何内容放入CDATA中,包括XML。CDATA之外的任何内容都将通过设计得到XML编码。因此,将CDATA移动到消息之外就可以了。“我还没有测试过,只是在研究理论&XML是如何工作的。”马修马丁·尼斯想,但我认为它不会工作。但事实并非如此。毕竟,如果它识别了CDATA标签,它就不会把已经在消息中间的那些东西拧了起来。好的,源代码在这里可能会有帮助:它确实做了一个错误的逃避,假设内容是文本。您可以尝试使用TraceData,但数据必须是XPathNavigator的形式,而不是字符串,否则它会再次落入转义文本路径。@MatthewMartin最后,我主要通过复制粘贴源代码来解决我的问题,研究从中编写自定义跟踪侦听器的方法,基本上,将XmlWriterTraceListener重新编写为我自己的XmlWriterTraceListener2。这很耗时,而且仍然存在一些问题,比如在不应该的时候截断日志,但这是朝着正确方向迈出的一步。如果我能完善的话,我会发布一个带有新类说明和代码的答案。
<message><![CDATA[Error parsing response from web service "someservice.com".]]></message><RequestBody...
<message><![CDATA[Error parsing response from web service "someservice.com".]]></message><RequestBody...