创建WCF操作调用程序

本文关键字:程序 调用 操作 WCF 创建 | 更新日期: 2023-09-27 18:11:30

如何在完整的wcf服务中创建以下模型

Operation behavior调用自定义操作调用程序,该调用程序根据Http请求头中传递的输入/值执行验证。验证成功后,用户将被重定向到实际操作。否则将抛出自定义异常,用户将被重定向到"Access Denied"页面。

创建WCF操作调用程序

实现自定义验证的一种方法是通过服务装饰器。考虑下面的代码:

[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类是一个decorator,它执行自定义验证,然后将请求传递给另一个服务。

现在,你需要托管的不是Service类,而是ServiceValidationDecorator类。

WCF会抱怨ServiceValidationDecorator没有无参数构造函数。解决这个问题的正确方法是创建一个自定义实例提供程序(看看这个),然后构造ServiceValidationDecorator对象(在实例提供程序中),像这样:

new ServiceValidationDecorator(new Service())

如果你想要一个快速的解决方案,只是为了快速测试,简单地在ServiceValidationDecorator构造函数中构造Service类(这实际上是一个糟糕的设计实践)。

如果你有很多服务,并且你不想为每个服务创建一个装饰器,可以看看面向方面编程(AOP)。搜索PostSharp或DynamicProxy