WCF服务端消息监测
发布日期:2022-03-30 20:19:27 浏览次数:12 分类:博客文章

本文共 2722 字,大约阅读时间需要 9 分钟。

WCF的调试工具很多,日志记录功能也很强大,但我们记录取得自定义的日志时(如用LOG4),WCF提供的日志记录器并不太适用,所以我们就需要自已处理WCF的消息处理,来记录我们的日志.

1 . 几个需要解释的对象

Message:WCF消息的承载对象,它的内容是符合SOAP标准的XML文本

IServiceBehavior:WCF服务动作的插件,以便附加更多的动作处理

IDispatchMessageInspector:入站和出站应用程序消息进行自定义检查或修改。

2.构建IDispatchMessageInspector对象,它用于侦测消息

///  /// 侦测入站与出站的消息 ///  public class MessageHandler : IDispatchMessageInspector {
 #region IDispatchMessageInspector
 /// 
 /// 操作开始前的处理
 ///  客户端请求消息
 ///  通道
 ///  实例上下文
 ///  自定义对象,这是保持为空
 public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel, InstanceContext instanceContext)
 {
 Debug.WriteLine("入站消息:{0}",request);//显示消息的全部内容
 return null;
 }
 /// 
 /// 操作结束后的操作(记录返回结果)
 /// 

 ///  准备返回客户端的消息
 ///  相关状态
 public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
 {
 Debug.WriteLine("出站消息:{0}", reply);//显示消息的全部内容
 }
 #endregion }

3 构建IServiceBehavior对象,它用于附加自定义Behavior,以便加入消息处理器

///  /// 自定义服务行为,以进行消息和异常的侦测与处理 ///  public class MyBehavior: IServiceBehavior {
 #region IServiceBehavior
 void IServiceBehavior.AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection  endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
 {
}
 /// 
 /// 处理以附加处理器
 /// 

 /// 
 /// 
 void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
 {
 ServiceType = serviceDescription.ServiceType;
 foreach (ChannelDispatcher di in serviceHostBase.ChannelDispatchers)
 {
 di.ErrorHandlers.Add(new ExceptionHandler());
 di.IncludeExceptionDetailInFaults = true;
 foreach (EndpointDispatcher epDisp in di.Endpoints)
 {
 epDisp.DispatchRuntime.MessageInspectors.Add(new MessageHandler());//加入消息记录处理器
 }
 }
 }
 void IServiceBehavior.Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
 {
 }
 #endregion }

注意:IServiceBehavior.ApplyDispatchBehavior方法实现时的这一句

epDisp.DispatchRuntime.MessageInspectors.Add(new MessageHandler());//加入消息记录处理器

它实现了消息处理器的加入

4 向服务加入自定义Behavior(编程方式)

ServiceHost host = new ServiceHost(typeof(MyService));//这个服务大家自己实现,不贴代码了host.Description.Behaviors.Add(new MyBehavior());//加入自定义Behaviorhost.Open();

说明:host.Description.Behaviors.Add 加入自定义Behavior,但要注意,一种类型只能加入一次,必须在Open之前加入.

特别说明:

多数这类文档都是在参考MSDN后写的,参见:

转载地址:https://www.cnblogs.com/agebull/archive/2011/04/25/2027731.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:基于SSM框架的简易的分页功能——包含maven项目的搭建
下一篇:UVAOJ 350 基础题 伪随机数 数论

发表评论

最新留言

不错!
[***.144.177.141]2023年03月06日 11时07分26秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

最新文章

mysql不是内部或外部命令,也不是可运行的程序 或批处理文件的其中一个解决方案 2019-12-15 02:39:27
mysql-增删改查 2019-12-15 02:39:27
在IDEA使用了@test以后无法在控制台输出 2019-12-15 02:39:27
JDBC连接方式的最终形态 2019-12-15 02:39:27
servlet改进jsp想要实现的功能 2019-12-15 02:39:27
学习笔记之jsp内置对象 2019-12-15 02:39:25
学习笔记之javabean 2019-12-15 02:39:25
学习笔记之jsp状态管理之cookie 2019-12-15 02:39:26
学习笔记之jsp指令与动作 2019-12-15 02:39:26
tomcat容器学习 2019-12-15 02:39:26
学习笔记之 servlet部分内容 2019-12-15 02:39:26
vue-响应式原理 2019-12-15 02:39:24
vue 官方文档 - 处理边界情况 2019-12-15 02:39:24
C/C++整理 2019-12-15 02:39:25
抽象工厂实例理解 2019-12-15 02:39:25
博客2-部分容器以及泛型 2019-12-15 02:39:25
HTTP-TCP总结 2019-12-15 02:39:23
Typescript笔记 2019-12-15 02:39:23
angular入门 2019-12-15 02:39:23
Git知识总结 2019-12-15 02:39:23