我与5个不同的运营合同签订了服务合同,并在IIS中托管。
现在假设我想根据对WCF服务的调用次数向客户(客户)收费(达到不同的运营合同)。
如何在WCF中这样做,我们需要在WCF服务端做什么设置?
答案 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)
{
}
}
然后实现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步中的属性应用于服务类。
[CounterBehavior]
public class YourService : IYourService
{
}
注意:对于Counter,您可以使用Static变量来跟踪方法的数量,只需确保线程中的增量安全。