Full source code available here.
In .Net Core Web Api it is not possible for the routing mechanism to distinguish between the following action methods.
public string GetSomething(int id, int something)
and
public string GetAnother(int id, int another)
But with the help of an ActionMethodSelectorAttribute
we can tell the methods apart.
Step 1
Add a new class called QueryStringConstraint
and inherit from ActionMethodSelectorAttribute
.
public class QueryStringConstraint : ActionMethodSelectorAttribute { public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor action) { IList<ParameterDescriptor> methodParameters = action.Parameters; ICollection<string> queryStringKeys = routeContext.HttpContext.Request.Query.Keys.Select(q => q.ToLower()).ToList(); IList<string> methodParamNames = methodParameters.Select(mp => mp.Name.ToLower()).ToList(); foreach (var methodParameter in methodParameters) { if (methodParameter.ParameterType.Name.Contains("Nullable")) { //check if the query string has a parameter that is not in the method params foreach(var q in queryStringKeys) { if (methodParamNames.All(mp => mp != q)) { return false; } } if(queryStringKeys.All(q => q != methodParameter.Name.ToLower())) { continue; } } else if (queryStringKeys.All(q => q != methodParameter.Name.ToLower())) { return false; } } return true; } }
Step 2
Add the QueryStringConstraint
to the action methods that need to be distinguished by query string parameters.
[QueryStringConstraint] public string GetAnother(int id, int another) { return $"GetAnother {id} {another}"; } // http://localhost:62922/api/values/?id=1&something=22 [QueryStringConstraint] public string GetSomething(int id, int something) { return $"GetSomething {id} {something}"; }
Full source code available here.