【问题标题】:creating WCF operation invoker创建 WCF 操作调用程序
【发布时间】:2015-12-03 04:56:02
【问题描述】:

如何在 resfull wcf 服务中创建以下模型

操作行为调用自定义操作调用程序,该调用程序根据 Http 请求标头中传递的输入/值执行验证。验证成功后,用户将被重定向到实际操作。否则会抛出自定义异常,用户将被重定向到“拒绝访问”页面。

【问题讨论】:

  • 一定要这样吗? (即通过操作行为)?不能用装饰器吗?或者也许是 AOP 方面?
  • 我不知道这 3 种方式中的任何一种。请提供一个链接以供阅读。

标签: c# .net wcf wcf-rest


【解决方案1】:

实现自定义验证的一种方法是通过服务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 没有无参数构造函数。解决这个问题的正确方法是创建一个自定义的 Instance Provider(看看 this),然后像这样构造 ServiceValidationDecorator 对象(在实例提供程序内):

new ServiceValidationDecorator(new Service())

如果您想要一个快速的解决方法来快速测试这一点,只需在 ServiceValidationDecorator 构造函数中构造 Service 类(这实际上是一种糟糕的设计实践)。

如果您有许多服务并且不想为每个服务创建装饰器,请查看面向方面的编程 (AOP)。搜索 PostSharp 或 DynamicProxy。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多