web-dev-qa-db-ja.com

Web API 2のDefaultInlineConstraintResolverエラー

Web API 2を使用していますが、ローカルボックスでPOST 7.5を使用してIISをAPIメソッドに送信すると、次のエラーが表示されます。

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

Line 21: GlobalConfiguration.Configuration.EnsureInitialized();

IISを使用してAPIは機能しません。ただし、IIS Expressを使用してVisual StudioでAPIプロジェクトを実行し、ログインAPIに対してPOSTを正常に作成できますが、別のGET要求を作成しようとするとAPI呼び出し、制約リゾルバーエラーが表示されます。

これをトラブルシューティングするために、Visual Studioで新しいWeb API 2プロジェクトを作成し、既存のAPIを一度に1つずつ新しいプロジェクトにインポートして、動作するように実行し始めました。この新しいプロジェクトでIIS Expressを使用すると、既存のAPIプロジェクトで行ったのとまったく同じ結果が得られます。

ここで何が欠けていますか?真新しいプロジェクトであっても、この制約リゾルバーの問題に遭遇することなくGET要求を行うことはできません。

126
Halcyon

エラーは、ルートのどこかに、次のようなものを指定したことを意味します

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

「string」は、他に何も指定されていない場合に想定されるタイプであるため、必要ありません。

エラーが示すように、Web APIに同梱されているDefaultInlineConstraintResolverには、stringというインライン制約がありません。デフォルトでサポートされているものは次のとおりです。

// 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) }
245
Kiran Challa

Int、bool、またはその他の制約を使用できない場合、もう1つ重要な点があり、空白を削除する必要があります。

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

次のように、ルートの変数名と変数タイプの間にスペースを置いたときにこのエラーが発生しました:

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

次のようになります。

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

1つのUndo Web APIメソッドのAPIルートを設計し、ルートのアクションにENUMデータ型検証を適用しようとしましたが、DefaultInlineConstrainResolverエラーの下で発生しました

エラー:System.InvalidOperationException: 'タイプ' DefaultInlineConstraintResolver 'のインライン制約リゾルバーは、次のインライン制約を解決できませんでした:' 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,
}

ENUM制約を適用するには、OrderCorrectionEnumRouteConstraintを使用してカスタム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;              
    }
}

リファレンス(これは私のブログです): https://rajeevdotnet.blogspot.com/2018/08/web-api-systeminvalidoperationexception.html 詳細

1
Rajeev Tiwari

Typeが文字列として宣言されているときにこのエラーが発生しました。それをintに変更すると、動作し始めました

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