ข้อผิดพลาด DefaultInlineConstraintResolver ใน WebAPI 2


140

ฉันใช้ Web API 2 และฉันได้รับข้อผิดพลาดต่อไปนี้เมื่อฉันส่ง POST ไปยังวิธี API ของฉันโดยใช้ IIS 7.5 บนกล่องภายในเครื่องของฉัน

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

Line 21: GlobalConfiguration.Configuration.EnsureInitialized();

API ของฉันไม่ทำงานโดยใช้ IIS อย่างไรก็ตามฉันสามารถรันโครงการ API ของฉันใน Visual Studio โดยใช้ IIS Express และทำการ POST ไปยัง API การลงชื่อเข้าใช้ของฉันได้สำเร็จ แต่เมื่อฉันลองและขอ GET ไปยังการเรียก API อื่นฉันได้รับข้อผิดพลาดของตัวแก้ไขข้อ จำกัด

เพื่อแก้ไขปัญหานี้ฉันได้สร้างโครงการ Web API 2 ใหม่ใน Visual Studio และเริ่มนำเข้า API ที่มีอยู่ไปยังโครงการใหม่ทีละโครงการและเรียกใช้เพื่อให้แน่ใจว่าทำงานได้ เมื่อใช้ IIS Express กับโครงการใหม่นี้ฉันได้ผลลัพธ์ที่แน่นอนเหมือนกับที่ทำกับโครงการ API ที่มีอยู่

ฉันหายไปนี่อะไร แม้จะมีโครงการใหม่เอี่ยมฉันไม่สามารถส่งคำขอ GET โดยไม่ประสบปัญหาตัวแก้ไขข้อ จำกัด นี้

คำตอบ:


279

ข้อผิดพลาดหมายความว่าคุณได้ระบุสิ่งที่ต้องการ

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

ไม่จำเป็นต้องใช้ "string" เนื่องจากเป็นชนิดสันนิษฐานหากไม่มีการระบุสิ่งใด

ในฐานะที่เป็นข้อผิดพลาดที่บ่งชี้ที่DefaultInlineConstraintResolverว่าเว็บเรือ 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ไม่สามารถใช้ข้อ จำกัด ใด ๆ
เดฟใหม่

31
ไม่จำเป็นต้องใช้ "string" เนื่องจากเป็นชนิดสันนิษฐานหากไม่มีการระบุสิ่งใด
Andrew Jens

1
@AndrewGray รายการนี้มีอยู่ที่นี่: asp.net/web-api/overview/web-api-routing-and-actions/…
Elijah Lofgren

2
ในกรณีที่ปัญหาเกิดขึ้นเนื่องจากแอตทริบิวต์เส้นทางเช่น: {string: type} เพียงลบ 'string:'
Asaf

33

อีกอย่างหนึ่งถ้าคุณไม่สามารถใช้ int, bool หรือข้อ จำกัด อื่น ๆ มันเป็นกุญแจสำคัญและคุณจำเป็นต้องลบช่องว่างสีขาว

//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

10

ฉันยังได้รับข้อผิดพลาดนี้เมื่อฉันเว้นวรรคระหว่างชื่อตัวแปรและประเภทตัวแปรในเส้นทางเช่น:

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

มันควรจะเป็นดังต่อไปนี้:

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

1

ฉันออกแบบเส้นทาง API สำหรับ Undo Web 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 อุปสรรคที่คุณต้องสร้างที่กำหนดเองโดยใช้OrderCorrectionEnumRouteConstraintIHttpRouteConstraint

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

ฉันได้รับข้อผิดพลาดนี้เมื่อพิมพ์ตามที่ประกาศเป็นสตริง เมื่อฉันเปลี่ยนมันเป็น int มันเริ่มทำงาน

[HttpGet][Route("testClass/master/{Type:string}")]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.