Kesalahan DefaultInlineConstraintResolver di WebAPI 2

143

Saya menggunakan Web API 2 dan saya mendapatkan kesalahan berikut ketika saya mengirim metode POST ke API saya menggunakan IIS 7.5 di kotak lokal saya.

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

Line 21: GlobalConfiguration.Configuration.EnsureInitialized();

Tidak ada API saya yang berfungsi menggunakan IIS. Namun, saya dapat menjalankan proyek API saya di Visual Studio menggunakan IIS Express dan berhasil membuat POST ke API login saya, tetapi ketika saya mencoba dan membuat permintaan GET ke panggilan API lain, saya mendapatkan kesalahan pemecah kendala.

Untuk memecahkan masalah ini, saya membuat proyek API Web 2 baru di Visual Studio dan mulai mengimpor API yang ada ke dalam proyek baru satu per satu dan menjalankannya untuk memastikannya berfungsi. Menggunakan IIS Express dengan proyek baru ini, saya mendapatkan hasil yang persis sama seperti yang saya lakukan dengan proyek API saya yang sudah ada.

Apa yang kulewatkan di sini? Bahkan dengan proyek baru, saya tidak dapat membuat permintaan GET tanpa mengalami masalah penyelesaian kendala ini.

Tenang
sumber

Jawaban:

284

Kesalahan berarti bahwa di suatu tempat di Route, Anda menentukan sesuatu seperti

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

"string" tidak diperlukan karena ini adalah jenis yang diasumsikan jika tidak ada yang lain yang ditentukan.

Seperti yang ditunjukkan oleh kesalahan, DefaultInlineConstraintResolveryang dikirimkan API Web tidak memiliki batasan sebaris yang dipanggil string. Yang didukung default adalah sebagai berikut:

// 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) }
Kiran Challa
sumber
2
Itu masuk akal mengapa saya melihat kesalahan. Saya memiliki {string: type} di atribut rute saya. Saya menghapusnya dan itu berfungsi sekarang.
Halcyon
3
@AndreasFurster: Karena stringtidak dapat menerapkan batasan apa pun.
Dave New
32
"string" tidak diperlukan karena ini adalah jenis yang diasumsikan jika tidak ada yang lain yang ditentukan.
Andrew Jens
1
@AndrewGray Daftar ini tersedia di sini: asp.net/web-api/overview/web-api-routing-and-actions/…
Elijah Lofgren
2
Jika masalahnya adalah karena atribut rute seperti: {string: type}, hapus saja 'string:'
Asaf
33

Satu hal lagi jika Anda tidak dapat menggunakan int, bool, atau batasan lainnya, ini adalah kunci sensitif dan Anda perlu menghapus spasi kosong.

//this will work
[Route("goodExample/{number:int}")]
[Route("goodExampleBool/{isQuestion:bool}")]
//this won't work
[Route("badExample/{number : int}")]
[Route("badExampleBool/{isQuestion : bool}")]
Serban Popescu
sumber
1
Anda akan berpikir mereka melakukan trim()ini setelah membelah dan sebelum melakukan perbandingan ... Tidak memotong string yang digunakan sebagai kunci adalah kesedihan utama saya sepanjang perjalanan kembali ke hari-hari saya di FoxPro.
DVK
10

Saya juga mendapat kesalahan ini ketika saya meninggalkan spasi antara nama variabel dan jenis variabel di rute, seperti:

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

Ini harus sebagai berikut:

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

Saya merancang rute API untuk satu metode Undo Web API dan saya mencoba menerapkan validasi tipe data ENUM pada tindakan dalam rute dan ditemui di bawah Kesalahan DefaultInlineConstrainResolver

Galat: System.InvalidOperationException: 'Penyelesai kendala sebaris tipe' DefaultInlineConstraintResolver 'tidak dapat menyelesaikan kendala sebaris berikut:' 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,
}

Untuk menerapkan batasan ENUM, Anda harus membuat kustom OrderCorrectionEnumRouteConstraintdengan menggunakan 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;              
    }
}

Referensi (Ini adalah blog saya): https://rajeevdotnet.blogspot.com/2018/08/web-api-systeminvalidoperationexception.html untuk lebih jelasnya

Rajeev Tiwari
sumber
0

Saya mendapat kesalahan ini ketika Type as dideklarasikan sebagai string. Ketika saya mengubahnya menjadi int itu mulai bekerja

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

Anda mendapatkan string sebagai jenis dengan cara berikut

[HttpGet]
[Route("users/{name}")]
public User GetUserByName(string name) { ... }

Pada dasarnya Anda tidak menentukan jenisnya

Donovan Phoenix
sumber