C# 更改IParameterInspector或IServiceBehavior在服务端输入的操作参数
我正在通过C# 更改IParameterInspector或IServiceBehavior在服务端输入的操作参数,c#,.net,validation,wcf,C#,.net,Validation,Wcf,我正在通过ipParameterInspector验证我的WCF服务操作,如: class MyParameterInspector : IParameterInspector { public object BeforeCall(string operationName, object[] inputs) { Token token = CarrierHelper.ReadMessageHeader<Token>(); //He
ipParameterInspector
验证我的WCF服务操作,如:
class MyParameterInspector : IParameterInspector
{
public object BeforeCall(string operationName, object[] inputs)
{
Token token = CarrierHelper.ReadMessageHeader<Token>();
//Here change the operation entered parameters or something else
}
}
public string MyOperation()
{
//Here I want to read that parameter which manipulate or make in BeforeCall
}
那么,有没有一种好的方法或解决方法来实现这种方法呢
更多解释:
通过ipParameterInspector
我们可以为每个操作定义一个ATRIB来检查用户对该操作的访问权限,因此我通过IOperationBehavior
和ipParameterInspector
实现了这一点,因此在BeforeCall
中检索用户并检查attrib是否为操作权限(操作授权)哪些是静态的作为枚举,但假设每个操作都应该知道如何在资源上运行(资源安全性,行级别安全性)资源是动态的,我不能将它们定义为静态的或硬代码,比如每个用户应该从数据库中读取权限,我认为也可以实现这一点,但我真的不知道如何实现
public class RemedyBehaviorAttribute : Attribute, IOperationBehavior
{
public PrimitiveActivity[] PermissionsToCheck { get; set; }
public RemedyBehaviorAttribute(params PrimitiveActivity[] pi)
{
PermissionsToCheck = pi;
}
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
}
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { }
public void AddBindingParameters(OperationDescription operationDescription,
BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(OperationDescription operationDescription,
ClientOperation clientOperation)
{
RemedyParameterInspector paramInspector = new RemedyParameterInspector
{
Permissions = PermissionsToCheck
};
clientOperation.ParameterInspectors.Add(paramInspector);
}
public void ApplyDispatchBehavior(OperationDescription operationDescription,
DispatchOperation dispatchOperation)
{
RemedyParameterInspector paramInspector = new RemedyParameterInspector
{
Permissions = PermissionsToCheck
};
dispatchOperation.ParameterInspectors.Add(paramInspector);
}
public void Validate(OperationDescription operationDescription)
{
}
}
class RemedyParameterInspector : IParameterInspector
{
public PrimitiveActivity[] Permissions { get; set; }
public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
{
}
public object BeforeCall(string operationName, object[] inputs)
{
Token token = CarrierHelper.ReadMessageHeader<Token>();
bool hasAccess = Permissions.Any(x => token.HasAccess(x));
if (!hasAccess)
throw new Exception(string.Format("Response to end user get failed, User:{0} have not access to operation:{1}...", token.UserGUID, operationName));
return null;
}
private void SetLoggingContext(object[] inputs, MethodInfo mi)
{
}
private void CreateArgumentForInvokeLog(MethodInfo mi, object[] inputs)
{
}
private void CreateArgumentForResultLog(MethodInfo mi, object[] outputs, object returnValue)
{
}
}
提前谢谢
[RemedyBehavior(PrimitiveActivity.Search, PrimitiveActivity.ManageExam)]
public DTO_OUT Search(DTO_IN find_DTO_IN)
{
}