Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何防止XmlWriterTraceListener在消息中使用xml编码字符_C#_Xml_Tracelistener_Xml Encoding - Fatal编程技术网

C# 如何防止XmlWriterTraceListener在消息中使用xml编码字符

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

我正在尝试使用System.Diagnostics.XmlWriterTraceListener登录到本地文件。我首先创建一个源并向其中添加一个新的XmlWriterTraceListener,如下所示:

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...
&lt;message&gt;&lt;![CDATA[Error parsing response from web service "someservice.com".]]&gt;&lt;/message&gt;&lt;RequestBody...