我一直在玩 Behaviors,发现我可以在 IparameterInspector 中访问 operationContext.Current。
IparameterInspector 实现:
class QuotaInspector : IParameterInspector
{
#region IParameterInspector Members
public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
{
}
public object BeforeCall(string operationName, object[] inputs)
{
if(ServiceSecurityContext.Current != null)
{
if(ServiceSecurityContext.Current.PrimaryIdentity != null
&& ServiceSecurityContext.Current.PrimaryIdentity.AuthenticationType == "MembershipProviderValidator")
{
String Account = String.Empty;
String serviceComponent = String.Empty;
if(!String.IsNullOrEmpty(ServiceSecurityContext.Current.PrimaryIdentity.Name))
Account = ServiceSecurityContext.Current.PrimaryIdentity.Name;
if(OperationContext.Current != null &&
OperationContext.Current.EndpointDispatcher != null
&& OperationContext.Current.EndpointDispatcher.DispatchRuntime != null
&& OperationContext.Current.EndpointDispatcher.DispatchRuntime.Type != null &&
!String.IsNullOrEmpty(OperationContext.Current.EndpointDispatcher.DispatchRuntime.Type.Name))
serviceComponent = ServiceSecurityContext.Current.PrimaryIdentity.Name;
if(!String.IsNullOrEmpty(Account) && !String.IsNullOrEmpty(serviceComponent) && !string.IsNullOrEmpty(operationName))
{
//Apply Quota verification here
//throw FaultException if quota is reached
}
}
}
return null;
}
#endregion
}
IOperationBehavior 实现:
class QuotaOperationBehavior : Attribute,IOperationBehavior
{
#region IOperationBehavior Members
public void AddBindingParameters(OperationDescription operationDescription, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.ClientOperation clientOperation)
{
}
public void ApplyDispatchBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.DispatchOperation dispatchOperation)
{
dispatchOperation.ParameterInspectors.Add(new QuotaInspector());
}
public void Validate(OperationDescription operationDescription)
{
}
#endregion
}
要将配额应用于方法,您只需声明一个属性:
public class MyService: IService
{
[QuotaOperationBehavior]
public IList<Entity> FindAll()
{
//retrieves entities
return entities;
}
}