我可以在所有控制器中添加强制参数吗? 我开发了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();
}
但我不想为每种方法手动完成。
答案 0 :(得分:1)
首先,您需要确定在操作主体内检索API密钥的确切方式。 由于您不希望将其作为方法的参数传递,它可以是控制器的属性(不是最好的方法,您必须创建自定义基本控制器类,但它可能适用于简单的方案)或另一个临时的每个请求存储。
然后,您需要创建一个Web API操作过滤器。它类似于常规的ASP.NET MVC动作过滤器,网上有很多教程,但大多数都是关于授权的。
此过滤器会尝试将请求中的API密钥注入控制器或您选择的临时存储中 - 在过滤器的OnActionExecuting
method内,您可以访问请求信息和控制器上下文。
完成所有操作后,只需在Web API配置中注册您的过滤器,这里有example如何执行此操作。