Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wcf 在(每次)Web API操作之前执行代码_Wcf_Asp.net Web Api - Fatal编程技术网

Wcf 在(每次)Web API操作之前执行代码

Wcf 在(每次)Web API操作之前执行代码,wcf,asp.net-web-api,Wcf,Asp.net Web Api,我有一个Web API接口,我正试图适应多租户体系结构。以前,我们有一个WCF模式,在此模式下,我们向服务传递了一个参数,即客户机ID,然后服务将其存储起来,以便在以后的代码中使用。这意味着客户端ID不必是传递给每个调用的第一个参数 我希望对Web API也这样做,即,而不是: GetDocument(int clientId, int documentId) GetDefault(int clientId) GetImage(int clientId, int imageId) 刚刚: Ge

我有一个Web API接口,我正试图适应多租户体系结构。以前,我们有一个WCF模式,在此模式下,我们向服务传递了一个参数,即客户机ID,然后服务将其存储起来,以便在以后的代码中使用。这意味着客户端ID不必是传递给每个调用的第一个参数

我希望对Web API也这样做,即,而不是:

GetDocument(int clientId, int documentId)
GetDefault(int clientId)
GetImage(int clientId, int imageId)
刚刚:

GetDocument(int documentId)
GetDefault()
GetImage(int imageId)
但我需要一些方法来完成以下工作:

  • 从路线上获取客户ID
  • 把这个值放到我得到的state对象中
  • 在调用实际执行之前。我有点认为路由将被重写——我对路由中必须包含客户端id很满意,只是没有API。因此对
    GetDefault
    的调用可能如下所示:

    /Document/GetDefault/1
    
    而API是:

    GetDefault()
    

    如何实现这一点?

    一种方法是定制ActionFilter。请看,虽然它是关于MVC的,但其概念与WebAPI相同:

    ASP.NET MVC提供用于执行筛选逻辑的操作筛选器 在调用操作方法之前或之后。动作过滤器是 提供声明性方法以添加预操作和 将操作后行为添加到控制器的操作方法

    例如:

        public class MyActionFilter : ActionFilterAttribute
        {
            public override void OnActionExecuting(HttpActionContext actionContext)
            {
               //....
            }
    
            public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
            {
               //....
            }
        }
    
    并使用它们装饰您的API控制器/操作:

        [MyActionFilter]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }
    
    [MyActionFilter]
    公共IEnumerable Get()
    {
    返回新字符串[]{“value1”,“value2”};
    }
    
    您可以尝试自定义
    ActionFilter
    ,甚至是
    MessageHandler
    。我很快模拟了一种使用客户id查询字符串的方法,它似乎可以工作,但没有会话状态,这就是我放置客户id的位置。我怀疑这是一种操作顺序,因此,当MessageHandler被激发时,会话状态不存在。会话状态稍后可以正常工作(我指定了一个实现iRequiresessionState的HttpControllerHandler)。加上它作为答案,我会接受的。