在ASP Web API中指定无效参数时返回错误

我正在使用C#和ASP.NET Web API创建一个API,我希望它在使用无法识别的参数时返回错误。

例如:

/api/Events 

应该列出一系列事件

 /api/Events?startTime={{startTime}} 

应该返回在特定时间开始的事件列表

 /api/Events?someRandomInvalidParameter={{something}} 

应该返回错误

有一个很好的配置方式来做到这一点? 如果没有,我怎样才能得到一个参数列表来检查自己。

您可以创建一个ActionFilter来自动执行此操作:

 public class InvalidQueryStringRejectorAttribute : ActionFilterAttribute { public override void OnActionExecuting(HttpActionContext actionContext) { var arguments = actionContext.ActionArguments.Keys; var queryString = actionContext.Request.GetQueryNameValuePairs() .Select(q => q.Key); var invalidParams = queryString.Where(k => !arguments.Contains(k)); if (invalidParams.Any()) { actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, new { message = "Invalid query string parameters", parameters = invalidParams }); } } } 

该filter将拒绝任何查询字符串参数与方法签名不匹配的请求。

您可以像这样使用它:

 [InvalidQueryStringRejector] public IHttpActionResult Get(string value) { return Ok(value); } 

或者通过在HttpConfiguration对象中注册来应用于任何操作:

 config.Filters.Add(new InvalidQueryStringRejectorAttribute()); 

尝试像这样的强类型动作

  public string Get() { return "I'm alive empty"; } public string Get([FromUri] int id) { return "I'm alive"; } 

所以正常的电话会让我恢复活力,或者我还活着

  http://localhost:1578/api/alive?id=1 //OR http://localhost:1578/api/alive 

但是,如果你试着这样称呼它

 http://localhost:1578/api/alive?blablabla=1 

您将发生此错误请求的资源不支持http方法’GET’。

我认为你应该覆盖方法
例:

 [Route("/app/Events/{startTime})"] public ApiResponse Get(string startTime) { } 

 [Route("/app/Events/{startTime}/{someRandomeInvalid}")] public ApiResponse Get(string startTime, string someRandomeInvalid) { } 

不要设置显式参数名称。 您应该按参数顺序进行管理/检查