我已经构建了一个Windows窗体客户端应用程序,它可以进行WCF调用.我希望能够在应用程序中显示实际的请求和响应,包括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()添加我的自定义侦听器的.这是正确的方法吗?