Return an error when invalid parameters are specified in ASP Web API

前端 未结 3 1211
长情又很酷
长情又很酷 2021-01-26 15:03

I\'m creating an API using C# and ASP.NET Web API and I want it to return an error when a parameter is used that isn\'t recognised.

For example:

/api/Eve         


        
相关标签:
3条回答
  • 2021-01-26 15:45

    You could create an ActionFilter to automate this:

    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
                });
            }
        }
    }
    

    That filter will reject any request with query string parameters that do not match the method signature.

    You may use it like this:

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

    Or apply to any action by registering it inside your HttpConfiguration object:

    config.Filters.Add(new InvalidQueryStringRejectorAttribute());
    
    0 讨论(0)
  • 2021-01-26 16:00

    try strongly typed actions like this

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

    So normal call will return I'm alive or I'm alive empty

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

    But if you try to call it like this

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

    You will occure this error The requested resource does not support http method 'GET'.

    0 讨论(0)
  • 2021-01-26 16:01

    I think you should be override methods
    Example:

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


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


    Don't set explicit parameters name. You should be manage/check by order of parameter

    0 讨论(0)
提交回复
热议问题