DefaultInlineConstraintResolver Error in WebAPI 2

C#asp.netIisasp.net Web-Api

C# Problem Overview


I'm using Web API 2 and I'm getting the following error when I send a POST to my API method using IIS 7.5 on my local box.

The inline constraint resolver of type 'DefaultInlineConstraintResolver' was unable to resolve the following inline constraint: 'string'.

Line 21: GlobalConfiguration.Configuration.EnsureInitialized();

None of my APIs work using IIS. However, I'm able to run my API project in Visual Studio using IIS Express and successfully make a POST to my login API, but when I try and make a GET request to another API call, I get the constraint resolver error.

In order to troubleshoot this, I created a brand new Web API 2 project in Visual Studio and started importing the existing APIs into the new project one at a time and running them to ensure they work. Using IIS Express with this new project, I get the same exact results as I did with my existing API project.

What am I missing here? Even with a brand new project I'm not able to make GET requests without running into this constraint resolver issue.

C# Solutions


Solution 1 - C#

The error means that somewhere in a Route, you specified something like

[Route("SomeRoute/{someparameter:string}")]

"string" is not needed as it is the assumed type if nothing else is specified.

As the error indicates, the DefaultInlineConstraintResolver that Web API ships with does not have an inline constraint called string. The default supported ones are the following:

// Type-specific constraints
{ "bool", typeof(BoolRouteConstraint) },
{ "datetime", typeof(DateTimeRouteConstraint) },
{ "decimal", typeof(DecimalRouteConstraint) },
{ "double", typeof(DoubleRouteConstraint) },
{ "float", typeof(FloatRouteConstraint) },
{ "guid", typeof(GuidRouteConstraint) },
{ "int", typeof(IntRouteConstraint) },
{ "long", typeof(LongRouteConstraint) },

// Length constraints
{ "minlength", typeof(MinLengthRouteConstraint) },
{ "maxlength", typeof(MaxLengthRouteConstraint) },
{ "length", typeof(LengthRouteConstraint) },
                
// Min/Max value constraints
{ "min", typeof(MinRouteConstraint) },
{ "max", typeof(MaxRouteConstraint) },
{ "range", typeof(RangeRouteConstraint) },

// Regex-based constraints
{ "alpha", typeof(AlphaRouteConstraint) },
{ "regex", typeof(RegexRouteConstraint) }

Solution 2 - C#

One more thing if you can't use int, bool or any other constraint it is key sensitive and you need to remove any white spaces.

//this will work
[Route("goodExample/{number:int}")]
[Route("goodExampleBool/{isQuestion:bool}")]
//this won't work
[Route("badExample/{number : int}")]
[Route("badExampleBool/{isQuestion : bool}")]

Solution 3 - C#

I also got this error when I left a space between the variable name and the variable type in the route, like so:

[HttpGet]
[Route("{id: int}", Name = "GetStuff")]

It should be the following:

[HttpGet]
[Route("{id:int}", Name = "GetStuff")]

Solution 4 - C#

You get strings as a type in the following manner

[HttpGet]
[Route("users/{name}")]
public User GetUserByName(string name) { ... }

Basically you just don't specify the type

Solution 5 - C#

I designed a API route for one Undo Web API method and I tried to apply ENUM datatype validation on action in route and encountered below DefaultInlineConstrainResolver Error

> Error: System.InvalidOperationException: 'The inline constraint > resolver of type 'DefaultInlineConstraintResolver' was unable to > resolve the following inline constraint: 'ActionEnum’

[HttpGet]
[Route("api/orders/undo/{orderID}/action/{actiontype: OrderCorrectionActionEnum}")]
public IHttpActionResult Undo(int orderID, OrderCorrectionActionEnum actiontype)
{
	_route(undo(orderID, action);
}

public enum OrderCorrectionActionEnum
{
	[EnumMember]
	Cleared,

	[EnumMember]
	Deleted,
}

To apply ENUM constrain, you have to create custom OrderCorrectionEnumRouteConstraint by using IHttpRouteConstraint.

public class OrderCorrectionEnumRouteConstraint : IHttpRouteConstraint
{
	public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
	{
		// You can also try Enum.IsDefined, but docs say nothing as to
		// is it case sensitive or not.
		var response = Enum.GetNames(typeof(OrderCorrectionActionEnum)).Any(s = > s.ToLowerInvariant() == values[parameterName].ToString().ToLowerInvariant());
		return response;
	}

	public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary< string, object> values, HttpRouteDirection routeDirection)
    {
		bool response = Enum.GetNames(typeof(BlockCorrectionActionEnum)).Any(s = > s.ToLowerInvariant() == values[parameterName].ToString().ToLowerInvariant());
        return response;              
    }
}

Reference (This is my blog): https://rajeevdotnet.blogspot.com/2018/08/web-api-systeminvalidoperationexception.html for more details

Solution 6 - C#

I got this error when Type as declared as string. When I changed that to int it started working

[HttpGet][Route("testClass/master/{Type:string}")]

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionHalcyonView Question on Stackoverflow
Solution 1 - C#KiranView Answer on Stackoverflow
Solution 2 - C#Serban PopescuView Answer on Stackoverflow
Solution 3 - C#Latin WarriorView Answer on Stackoverflow
Solution 4 - C#Donovan PhoenixView Answer on Stackoverflow
Solution 5 - C#Rajeev TiwariView Answer on Stackoverflow
Solution 6 - C#copycatView Answer on Stackoverflow