计算对WCF服务的调用次数

时间:2016-05-10 15:58:50

标签: wcf

我与5个不同的运营合同签订了服务合同,并在IIS中托管。

现在假设我想根据对WCF服务的调用次数向客户(客户)收费(达到不同的运营合同)。

如何在WCF中这样做,我们需要在WCF服务端做什么设置?

2 个答案:

答案 0 :(得分:0)

您可以从每个服务实现方法中调用一些标准方法(可能使用CallerMemberNameAttribute来节省一些输入)

或者您可以使用WCF custom behaviors

注入“会计”方法

答案 1 :(得分:0)

WCF提供扩展点;其中WCF扩展有助于在WCF管道中的不同位置插入任何自定义代码。

根据需要,您可以使用MessageInspector检查消息并为方法调用增加计数器。 MessageInspector允许拦截和检查进出服务层基础架构的消息。消息检查器可以应用于客户端和服务器端。

1.在此特定方案中,您需要通过实施IDispatchMessageInspector

来使用服务器端检查器
public class MessageCounterMessageInspector : IDispatchMessageInspector
{
    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
    {
        // Increment Counter in thread safe way
    }

    public void BeforeSendReply(ref Message reply, object correlationState)
    {        
    }
}
  1. 然后实现IServiceBehavior界面。

    [AttributeUsage(AttributeTargets.Class)]
    public class CounterBehavior : Attribute, IServiceBehavior
    {
    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
    {
    }
    
    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        for (int i = 0; i < serviceHostBase.ChannelDispatchers.Count; i++)
        {
            ChannelDispatcher channelDispatcher = serviceHostBase.ChannelDispatchers[i] as ChannelDispatcher;
            if (channelDispatcher != null)
            {
                foreach (EndpointDispatcher endpointDispatcher in channelDispatcher.Endpoints)
                {
                    MessageCounterMessageInspector inspector = new MessageCounterMessageInspector ();
                    endpointDispatcher.DispatchRuntime.MessageInspectors.Add(inspector);
                }
            }
        }
    }
    
    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
    }
    }
    
  2. 将第2步中的属性应用于服务类。

    [CounterBehavior]
    public class YourService : IYourService
    {
    
    }
    
  3. 注意:对于Counter,您可以使用Static变量来跟踪方法的数量,只需确保线程中的增量安全。