WebAPI 2'de DefaultInlineConstraintResolver Hatası


140

Web API 2 kullanıyorum ve yerel kutuda IIS 7.5 kullanarak API yöntemime bir POST gönderdiğimde aşağıdaki hatayı alıyorum.

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

Line 21: GlobalConfiguration.Configuration.EnsureInitialized();

API'larımdan hiçbiri IIS kullanarak çalışmıyor. Ancak, IIS Express kullanarak API projemi Visual Studio'da çalıştırabilir ve oturum açma API'ma başarıyla bir POST yapabilirim, ancak başka bir API çağrısına GET isteği yapmaya çalıştığımda kısıtlama çözücü hatası alıyorum.

Bu sorunu gidermek için Visual Studio'da yepyeni bir Web API 2 projesi oluşturdum ve mevcut API'ları yeni projeye birer birer içe aktarmaya ve çalıştıklarından emin olmak için çalıştırmaya başladım. IIS Express'i bu yeni projeyle kullanarak, mevcut API projemle aynı sonuçları alıyorum.

Burada ne eksik? Yepyeni bir projede bile, bu kısıt çözücü sorununa girmeden GET istekleri yapamıyorum.

Yanıtlar:


279

Hata, bir Güzergahın herhangi bir yerinde,

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

Başka bir şey belirtilmezse varsayılan tür olduğundan "dize" gerekmez.

Hatanın belirttiği gibi, DefaultInlineConstraintResolverWeb API'sının gönderdiği satır içi kısıtlaması yoktur string. Varsayılan desteklenenler şunlardır:

// 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
Bu, hataları neden gördüğümü anlamlandırıyor. Benim rota özniteliğinde {string: type} vardı. Kaldırdım ve şimdi çalışıyor.
Halcyon

3
@AndreasFurster: Çünkü stringherhangi bir kısıtlama uygulanamaz.
Dave New

31
Başka bir şey belirtilmezse varsayılan tür olduğundan "dize" gerekmez.
Andrew Jens

1
@AndrewGray Bu listeye buradan ulaşabilirsiniz: asp.net/web-api/overview/web-api-routing-and-actions/…
Elijah Lofgren

2
Sorunun aşağıdaki gibi route özniteliğinden kaynaklanması durumunda: 'string:'
Asaf

33

İnt, bool veya başka bir kısıtlama kullanamıyorsanız, anahtar duyarlıdır ve beyaz boşlukları kaldırmanız gerekir.

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

1
Bunları böldükten trim()sonra ve bir karşılaştırma yapmadan önce düşünürdünüz ... Anahtarlar olarak kullanılan dizeleri kırpmamak, benim FoxPro günlerime kadar giden büyük bir evcil hayvanım.
DVK

10

Değişken adı ile yoldaki değişken türü arasında bir boşluk bıraktığımda da bu hatayı aldım:

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

Aşağıdaki gibi olmalıdır:

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

1

Bir Undo Web API yöntemi için bir API yolu tasarladım ve rotadaki eylemde ENUM veri türü doğrulaması uygulamaya çalıştım ve aşağıda karşılaştık DefaultInlineConstrainResolver Hatası

Hata: System.InvalidOperationException: '' DefaultInlineConstraintResolver 'türündeki satır içi kısıtlama çözümleyicisi aşağıdaki satır içi kısıtlamayı çözümleyemedi:' 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 kısıtlamayla uygulamak için özel oluşturmak zorunda OrderCorrectionEnumRouteConstraintkullanarak 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;              
    }
}

Referans (Bu benim blogum): daha fazla bilgi için https://rajeevdotnet.blogspot.com/2018/08/web-api-systeminvalidoperationexception.html


0

Bu hatayı dize olarak bildirildiğinde yazın. Bunu int olarak değiştirdiğimde çalışmaya başladı

[HttpGet][Route("testClass/master/{Type:string}")]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.