Lỗi mặc địnhInlineConstraintResolver trong WebAPI 2


140

Tôi đang sử dụng API Web 2 và tôi gặp lỗi sau khi gửi POST cho phương thức API của mình bằng IIS 7.5 trên hộp cục bộ.

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

Line 21: GlobalConfiguration.Configuration.EnsureInitialized();

Không có API nào của tôi hoạt động bằng IIS. Tuy nhiên, tôi có thể chạy dự án API của mình trong Visual Studio bằng IIS Express và thực hiện thành công POST cho API đăng nhập của mình, nhưng khi tôi thử và thực hiện yêu cầu GET cho một lệnh gọi API khác, tôi gặp lỗi trình giải quyết ràng buộc.

Để khắc phục sự cố này, tôi đã tạo một dự án API Web 2 hoàn toàn mới trong Visual Studio và bắt đầu nhập các API hiện có vào dự án mới một lần và chạy chúng để đảm bảo chúng hoạt động. Sử dụng IIS Express với dự án mới này, tôi nhận được kết quả chính xác như tôi đã làm với dự án API hiện tại của mình.

Tôi đang thiếu gì ở đây? Ngay cả với một dự án hoàn toàn mới, tôi không thể thực hiện các yêu cầu GET mà không gặp phải vấn đề về trình giải quyết ràng buộc này.

Câu trả lời:


279

Lỗi có nghĩa là ở đâu đó trong Tuyến đường, bạn đã chỉ định một cái gì đó như

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

"chuỗi" là không cần thiết vì nó là loại giả định nếu không có gì khác được chỉ định.

Như lỗi chỉ ra, DefaultInlineConstraintResolverAPI Web đi kèm không có ràng buộc nội tuyến được gọi string. Những cái được hỗ trợ mặc định là như sau:

// 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
Điều đó có ý nghĩa tại sao tôi đã nhìn thấy các lỗi. Tôi đã có {chuỗi: type} trong thuộc tính tuyến đường của mình. Tôi đã gỡ bỏ nó và nó đang hoạt động.
Halcyon

3
@AndreasFurster: Bởi vì stringkhông thể áp dụng bất kỳ ràng buộc nào.
Dave New

31
"chuỗi" là không cần thiết vì nó là loại giả định nếu không có gì khác được chỉ định.
Andrew Jens

1
@AndrewGray Danh sách này hiện có sẵn ở đây: asp.net/web-api/overview/web-api-routing-and-actions/...
Elijah Lofgren

2
Trong trường hợp sự cố là do thuộc tính tuyến đường như: {string: type}, chỉ cần xóa 'chuỗi:'
Asaf

33

Một điều nữa nếu bạn không thể sử dụng int, bool hoặc bất kỳ ràng buộc nào khác thì đó là khóa nhạy cảm và bạn cần xóa mọi khoảng trắng.

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

1
Bạn sẽ nghĩ rằng chúng là trim()những thứ này sau khi chia tách và trước khi so sánh ... Không cắt xén các chuỗi được sử dụng làm chìa khóa là một tiểu thú cưng lớn của tôi sẽ quay trở lại thời FoxPro của tôi.
DVK

10

Tôi cũng gặp lỗi này khi để lại một khoảng trắng giữa tên biến và loại biến trong tuyến đường, như vậy:

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

Nó nên như sau:

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

1

Tôi đã thiết kế một lộ trình API cho một phương pháp Hoàn tác API Web và tôi đã thử áp dụng xác thực kiểu dữ liệu ENUM trên hành động trong tuyến đường và gặp phải bên dưới Lỗi DefaultInlineConstrainResolver

Lỗi: System.InvalidOperationException: 'Trình phân giải ràng buộc nội tuyến loại' DefaultInlineConstraintResolver 'không thể giải quyết các ràng buộc nội tuyến sau:' 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,
}

Để áp dụng ràng buộc ENUM, bạn phải tạo tùy chỉnh OrderCorrectionEnumRouteConstraintbằng cách sử dụng 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;              
    }
}

Tham khảo (Đây là blog của tôi): https://rajeevdotnet.blogspot.com/2018/08/web-api-systeminvalidoperationexception.html để biết thêm chi tiết


0

Tôi đã gặp lỗi này khi Loại như khai báo dưới dạng chuỗi. Khi tôi thay đổi nó thành int nó bắt đầu làm việc

[HttpGet][Route("testClass/master/{Type:string}")]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.