0

我可以向所有控制器添加强制参数吗?我开发 RESTful api,所以我想为每条路线都需要特殊的“apikey”参数。

        [HttpPut]
    [PUT("create")]
    public PostDto Create(string title, string description, string tag, long photo, float lat, float lon, int error)
    {
        if (description.Length > DescriptionMaxLength)
            throw new ApiException(ErrorList.TooLongDescription, string.Format("Description is more than {0}", DescriptionMaxLength));

        throw new NotImplementedException();
    }

    [HttpPost]
    [POST("edit/{id:int}")]
    public bool Edit(int id, string title, string description, int? photo)
    {
        if (description.Length > DescriptionMaxLength)
            throw new ApiException(ErrorList.TooLongDescription, string.Format("Description is more than {0}", DescriptionMaxLength));

        throw new NotImplementedException();
    }

    [HttpDelete]
    [DELETE("delete/{id:int}")]
    public bool Delete(int id)
    {
        if (id < 0)
            throw new ApiException(ErrorList.InvalidValue, "id is smaller than 0");

        throw new NotImplementedException();
    }

但我不想为每种方法手动完成。

4

1 回答 1

1

首先,您需要确定在操作主体中检索 API 密钥的确切方式。由于您不想将它作为方法的参数传递,它可以是控制器的属性(不是最好的方法,您必须创建一个自定义基控制器类,但它可能适用于简单的场景)或另一个临时的每个请求存储。

然后您需要创建一个 Web API 操作过滤器。它类似于常规的 ASP.NET MVC 动作过滤器,网上有很多教程,不过大部分都是关于授权的。

此过滤器将尝试将请求中的 API 密钥注入控制器或您选择的临时存储 - 在过滤器的OnActionExecuting 方法中,您可以访问请求信息和控制器上下文。

完成后,只需在 Web API 配置中注册您的过滤器,这里有一个如何执行此操作的示例。

于 2013-08-02T18:50:08.810 回答