如何在resfull wcf服务中创建以下模型
Operation Behavior调用自定义操作调用程序,该调用程序根据Http请求标头中传递的输入/值执行验证。验证成功后,用户将被重定向到实际操作。否则将抛出自定义异常,用户将被重定向到“拒绝访问”页面。
答案 0 :(得分:0)
实现自定义验证的一种方法是通过服务decorator。请考虑以下代码:
[ServiceContract]
public interface IService
{
[OperationContract]
string GetData(int value);
}
public class Service : IService
{
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
}
public class ServiceValidationDecorator : IService
{
private readonly IService m_DecoreatedService;
public ServiceValidationDecorator(IService decoreated_service)
{
m_DecoreatedService = decoreated_service;
}
public string GetData(int value)
{
IncomingWebRequestContext request = WebOperationContext.Current.IncomingRequest;
WebHeaderCollection headers = request.Headers;
//Here use the headers to do you custom validation
bool valid = ...
if(!valid)
throw new SecurityException("Access Denied");
return m_DecoreatedService.GetData(value);
}
}
这里,WCF合同是IService,原始服务实现是Service类。
ServiceValidationDecorator类是一个装饰器,它执行自定义验证,然后将请求传递给另一个服务。
现在,您需要托管ServiceValidationDecorator类,而不是托管Service类。
WCF会抱怨ServiceValidationDecorator没有无参数构造函数。解决此问题的正确方法是创建自定义实例提供程序(查看this),然后构造ServiceValidationDecorator对象(在实例提供程序中),如下所示:
new ServiceValidationDecorator(new Service())
如果您想快速解决方法只是为了快速测试,请在ServiceValidationDecorator构造函数中构造Service类(这实际上是一个糟糕的设计实践)。
如果您有许多服务并且您不想为每项服务创建装饰器,请查看面向方面编程(AOP)。搜索PostSharp或DynamicProxy。