我已经构建了一个进行 WCF 调用的 Windows 窗体客户端应用程序。我希望能够从应用程序中显示实际的请求和响应,包括 SOAP 标头和有关 POST/Get 的信息。有没有办法在客户端上配置跟踪侦听器并在客户端内使用它,在文本框中显示内容?
我已经配置了将消息输出到文件的跟踪。此配置在我的客户端应用程序上,因此它记录了它对 wcf 服务的所有调用和响应。因此添加了源,并且每个源都有一个 XmlTraceListener,它处理对 xml 日志文件的写入。我现在要做的是利用客户端应用程序本身中的跟踪侦听器并写入文本框控件。
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="All">
<listeners>
<add name="xmlTraceListener" />
</listeners>
</source>
<source name="System.ServiceModel.MessageLogging"
switchValue="All">
<listeners>
<add name="xmlTraceListener" />
</listeners>
</source>
</sources>
<sharedListeners>
<add name="xmlTraceListener"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="ClientLogBasic.svclog" />
</sharedListeners>
<trace autoflush="true" />
</system.diagnostics>
<!-- child of the <system.serviceModel> element -->
<diagnostics>
<messageLogging maxMessagesToLog="10000"
logEntireMessage="true"
logMessagesAtServiceLevel="true"
logMalformedMessages="true"
logMessagesAtTransportLevel="true">
<filters>
<clear/>
</filters>
</messageLogging>
</diagnostics>
所以现在我的消息记录已经工作了,我创建了自己的可以写入文本框的跟踪侦听器:
public class MyTraceListender : System.Diagnostics.TraceListener
{
private TextBox txt_m;
public MyTraceListender(TextBox txt)
: base()
{
txt_m = txt;
}
private delegate void delWrite(string sText);
public override void Write(string message)
{
txt_m.Invoke(new delWrite(AsyncWrite), message);
}
public override void WriteLine(string message)
{
this.Write(message + System.Environment.NewLine);
}
private void AsyncWrite(string sMessage)
{
this.txt_m.AppendText(sMessage);
}
}
现在我有了跟踪侦听器,我想尝试从我的 Windows 窗体客户端应用程序中使用它。
public partial class Form1 : Form
{
private MyTraceListender listener_m;
public Form1()
{
InitializeComponent();
listener_m = new MyTraceListender(this.txtOutput);
System.Diagnostics.Trace.Listeners.Add(listener_m);
}
private void button1_Click(object sender, EventArgs e)
{
ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
string sValue = client.GetData(1234);
}
}
在这一点上,我仍然没有看到记录到文本框控件。我认为侦听器与源无关,所以我尝试了以下方法:
public partial class Form1 : Form
{
private MyTraceListender listener_m;
public static System.Diagnostics.TraceSource source = new System.Diagnostics.TraceSource("System.ServiceModel.MessageLogging", System.Diagnostics.SourceLevels.All);
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
string sValue = client.GetData(1234);
}
private void Form1_Load(object sender, EventArgs e)
{
listener_m = new MyTraceListender("test", this.txtOutput);
source.Listeners.Add(listener_m);
}
}
毕竟,消息不会被记录到表单上的文本框中。它们通过 XmlTraceListener 记录到文件中,所以我假设问题是我如何通过 System.Diagnostics.Trace.Listeners.Add() 添加自定义侦听器。这是正确的方法吗?