WCF服务端消息监测

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

1 . 几个需要解释的对象

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

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

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

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

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

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

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

    } 
    /// <summary> 
    /// 处理以附加处理器 
    /// </summary> 
    /// <param name="serviceDescription"></param> 
    /// <param name="serviceHostBase"></param> 
    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());//加入自定义Behavior

host.Open();

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

特别说明:

多数这类文档都是在参考MSDN后写的,参见:http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=ZH-CN&k=k(ISERVICEBEHAVIOR);k(SOLUTIONITEMSPROJECT);k(TargetFrameworkMoniker-%22SILVERLIGHT%2cVERSION%3dV5.0%22);k(DevLang-CSHARP)&rd=true

转载于:https://www.cnblogs.com/agebull/archive/2011/04/25/2027731.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值