如何将WCF路由服务日志消息发送到SQL Server

时间:2013-06-10 17:24:09

标签: wcf

我正在尝试使用路由服务(http://msdn.microsoft.com/en-us/library/ee517422.aspx)将数据从客户端路由到其他端点。我有多个客户端,从路由服务调用的端点位于第三方。

我还需要将通过路由服务传递的每个事务记录到SQL数据库中。

问题是我无法在路由服务中编写自定义代码,因为它在配置文件中工作。鉴于我无法在这些类中编写自定义代码,我该如何实现呢?

1 个答案:

答案 0 :(得分:1)

1)创建一个类库并使用强键对其进行签名。

2)创建RoutingServiceBehavior类这个类将实现IServiceBehavior,IDispatchMessageInspector接口,消息拦截的代码将在这个类中:

using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;

namespace Services.RoutingServiceBehavior
{
    public class RoutingServiceBehavior : IServiceBehavior, IDispatchMessageInspector
    {
        public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
        {
            // This is your envelop
            string s = request.ToString();
            return null;
        }

        public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
        {

        }

        public void AddBindingParameters(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
        {

        }

        public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)
        {
            foreach (ChannelDispatcher channelDispatcher in serviceHostBase.ChannelDispatchers)
            {
                foreach (EndpointDispatcher endpointDispatcher in channelDispatcher.Endpoints)
                {
                    endpointDispatcher.DispatchRuntime.MessageInspectors.Add(this);
                }
            }  

        }

        public void Validate(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)
        {

        }
    }
}
3)创建RoutingServiceBehaviorElement类,这个类将实现BehaviorExtensionElement接口:

using System;
using System.ServiceModel.Configuration;

namespace Services.RoutingServiceBehavior
{
    public class RoutingServiceBehaviorElement : BehaviorExtensionElement
    {
        public override Type BehaviorType
        {
            get { return typeof(RoutingServiceBehavior); }
        }

        protected override object CreateBehavior()
        {
            return new RoutingServiceBehavior();
        }
    }
}

4)建立你的项目 5)将您的组件添加到GAC 6)打开machine.config并在<behaviorExtensions>下添加程序集的名称,它应该是这样的:

<add name="RoutingServiceBehavior" type="Services.RoutingServiceBehavior.RoutingServiceBehaviorElement, Services.RoutingServiceBehavior, Version=1.0.0.0, Culture=neutral" />

7)在<serviceDebug>

下的wcf服务中添加服务行为的名称
<RoutingServiceBehavior/>

8)确保程序集dll包含在WCF服务中。