能否在无配置文件的WCF应用中通过代码实现追踪?
嘿,我懂你现在的处境——纯代码搭建的WCF服务/客户端,完全没碰配置文件,现在想加消息追踪却找不到对应的代码实现方式对吧?别慌,我这就把你之前用配置文件实现的追踪逻辑,转换成纯代码的形式,这样你就能在代码里直接启用消息日志了。
完整服务端代码实现
下面是对应你配置文件逻辑的纯代码实现,你可以直接整合到自己的服务托管代码中:
using System; using System.Diagnostics; using System.IO; using System.ServiceModel; using System.ServiceModel.Configuration; class Program { static void Main(string[] args) { // 先确保日志目录存在,避免写入失败 var logPath = @"d:\logs\myMessages.svclog"; var logDir = Path.GetDirectoryName(logPath); if (!Directory.Exists(logDir)) { Directory.CreateDirectory(logDir); } // 配置Diagnostics监听器,对应<system.diagnostics>节点 var messageListener = new XmlWriterTraceListener(logPath); var messageLoggingSource = new TraceSource("System.ServiceModel.MessageLogging"); messageLoggingSource.Listeners.Add(messageListener); messageLoggingSource.Switch.Level = SourceLevels.Information; // 按需调整日志级别 // 替换成你的服务类型和地址 using (var serviceHost = new ServiceHost(typeof(YourServiceType), new Uri("http://localhost:8080/YourService"))) { // 你的原有代码:添加绑定和契约 serviceHost.AddServiceEndpoint(typeof(IYourServiceContract), new BasicHttpBinding(), ""); // 配置WCF消息日志行为,对应<system.serviceModel><diagnostics>节点 var messageLogging = new MessageLoggingElement(); messageLogging.LogEntireMessage = true; messageLogging.LogMessagesAtServiceLevel = false; messageLogging.LogMessagesAtTransportLevel = false; messageLogging.LogMalformedMessages = true; messageLogging.MaxMessagesToLog = 5000; messageLogging.MaxSizeOfMessageToLog = 2000; var diagnosticsBehavior = new ServiceDiagnosticBehavior(); diagnosticsBehavior.MessageLogging = messageLogging; serviceHost.Description.Behaviors.Add(diagnosticsBehavior); // 启动服务 serviceHost.Open(); Console.WriteLine("服务已启动,按任意键停止..."); Console.ReadKey(); } } }
客户端代码实现(如果需要在客户端追踪)
如果是客户端需要启用消息日志,逻辑类似,只需要把诊断行为添加到ChannelFactory的端点行为中:
using System.ServiceModel; using System.ServiceModel.Configuration; // 替换成你的契约、绑定和服务地址 using (var channelFactory = new ChannelFactory<IYourServiceContract>(new BasicHttpBinding(), new EndpointAddress("http://localhost:8080/YourService"))) { // 配置消息日志行为 var messageLogging = new MessageLoggingElement(); messageLogging.LogEntireMessage = true; messageLogging.LogMessagesAtServiceLevel = false; messageLogging.LogMessagesAtTransportLevel = false; messageLogging.LogMalformedMessages = true; messageLogging.MaxMessagesToLog = 5000; messageLogging.MaxSizeOfMessageToLog = 2000; var diagnosticsBehavior = new ServiceDiagnosticBehavior(); diagnosticsBehavior.MessageLogging = messageLogging; channelFactory.Endpoint.Behaviors.Add(diagnosticsBehavior); // 创建通道并调用服务 var client = channelFactory.CreateChannel(); client.YourServiceMethod(); }
关键部分说明
XmlWriterTraceListener:对应你配置文件里的监听器配置,负责把日志写入指定的.svclog文件;TraceSource("System.ServiceModel.MessageLogging"):对应配置里的<source>节点,指定要监听的WCF消息日志源;MessageLoggingElement:完全对应配置里的<messageLogging>节点的各个属性,你可以根据需要调整参数;ServiceDiagnosticBehavior:把消息日志配置注入到WCF的诊断体系中,对应配置里的<diagnostics>节点。
记得要引用System.ServiceModel和System.ServiceModel.Configuration命名空间,否则这些类会无法识别。
内容的提问来源于stack exchange,提问作者Soumyajit
相关产品推荐
相关产品推荐

