WebAPI 2のDefaultInlineConstraintResolverエラー


140

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

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

Line 21: GlobalConfiguration.Configuration.EnsureInitialized();

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

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

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

回答:


279

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

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

「文字列」は、他に何も指定されていない場合に想定される型であるため、必要ありません。

エラーが示すように、DefaultInlineConstraintResolverWeb APIに同梱されているには、というインライン制約がありません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) }

2
それが私がエラーを見た理由です。ルート属性に{string:type}がありました。私はそれを削除し、それは今働いています。
Halcyon

3
@AndreasFurster:string制約を適用できないため。
Dave New

31
「文字列」は、他に何も指定されていない場合に想定される型であるため、必要ありません。
Andrew Jens、

1
@AndrewGrayこのリストはこちらから入手できます。asp.net
Elijah Lofgren

2
{string:type}のようなルート属性が原因で問題が発生した場合は、「string:」を削除するだけ
Asaf

33

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}")]

1
trim()分割した後、比較を行う前に、これらを使用していると思います...キーとして使用される文字列をトリミングしないことは、私のFoxPro時代にさかのぼる私の大きな不満です。
DVK 2018

10

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

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

次のようになります。

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

1

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


0

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

[HttpGet][Route("testClass/master/{Type:string}")]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.