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

时间:2016-06-13 09:40:41

标签: c# asp.net web asp.net-web-api2

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

例如:

/api/Events

应该是一个事件列表

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

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

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

应该返回错误

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

3 个答案:

答案 0 :(得分:1)

尝试像这样的强类型动作

  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'。             

答案 1 :(得分:1)

您可以创建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
            });
        }
    }
}

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

你可以这样使用它:

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

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

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

答案 2 :(得分:0)

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

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


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


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