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
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());
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'.
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