WebAPI 2 में DefaultInlineConstraintResolver त्रुटि


140

जब मैं अपने स्थानीय बॉक्स पर IIS 7.5 का उपयोग करके अपने API विधि के लिए POST भेजता हूं, तो मैं वेब API 2 का उपयोग कर रहा हूं और मुझे निम्न त्रुटि हो रही है।

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

Line 21: GlobalConfiguration.Configuration.EnsureInitialized();

मेरा कोई भी API IIS का उपयोग करके काम नहीं करता है। हालाँकि, मैं IIS एक्सप्रेस का उपयोग करके विजुअल स्टूडियो में अपनी एपीआई परियोजना को चलाने में सक्षम हूं और सफलतापूर्वक अपने लॉगिन एपीआई के लिए एक पोस्ट बना सकता हूं, लेकिन जब मैं कोशिश करता हूं और किसी अन्य एपीआई कॉल के लिए जीईटी अनुरोध करता हूं, तो मुझे बाधा रिवाल्वर त्रुटि मिलती है।

इस समस्या का निवारण करने के लिए, मैंने विज़ुअल स्टूडियो में एक नया वेब एपीआई 2 प्रोजेक्ट बनाया और मौजूदा एपीआई को एक बार में नए प्रोजेक्ट में आयात करना और उन्हें सुनिश्चित करने के लिए उन्हें चलाना शुरू किया। इस नई परियोजना के साथ IIS एक्सप्रेस का उपयोग करने पर मुझे वही सटीक परिणाम मिलते हैं जैसे मैंने अपने मौजूदा एपीआई प्रोजेक्ट के साथ दिए थे।

मुझे यहां क्या समझ नहीं आ रहा है? यहां तक ​​कि एक ब्रांड नई परियोजना के साथ भी मैं इस समस्या को हल करने के लिए जीईटी अनुरोध करने में सक्षम नहीं हूं।

जवाबों:


279

त्रुटि का अर्थ है कि कहीं रूट में, आपने कुछ ऐसा निर्दिष्ट किया है

[Route("SomeRoute/{someparameter: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} था। मैंने इसे हटा दिया और यह अब काम कर रहा है।
हेलसीयन

3
@AndreasFurster: क्योंकि stringकोई अड़चन नहीं लगा सकता।
डेव न्यू

31
"स्ट्रिंग" की आवश्यकता नहीं है क्योंकि यह मान लिया गया प्रकार है यदि कुछ और निर्दिष्ट नहीं है।
एंड्रयू जेन्स

1
@AndrewGray यह सूची यहां उपलब्ध है: asp.net/web-api/overview/web-api-rout-and-actions/…
Elijah Lofgren

2
मामले में समस्या इसलिए थी क्योंकि मार्ग विशेषता जैसे: {string: type}, बस 'string:' को हटा दें
Asaf

33

एक और बात अगर आप इंट, बूल या किसी अन्य बाधा का उपयोग नहीं कर सकते हैं तो यह महत्वपूर्ण संवेदनशील है और आपको किसी भी सफेद स्थान को हटाने की आवश्यकता है।

//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()बंटवारे के बाद और तुलना करने से पहले इन्हें पसंद करेंगे ... कुंजियों के रूप में इस्तेमाल किए जाने वाले तार को ट्रिम नहीं करना मेरा एक बड़ा पालतू पेशाब है जो मेरे फॉक्सप्रो दिनों में वापस जाने के सभी रास्ते हैं।
DVK

10

मुझे यह त्रुटि तब मिली जब मैंने चर नाम और मार्ग में चर प्रकार के बीच एक स्थान छोड़ा, जैसे:

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

यह निम्नलिखित होना चाहिए:

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

1

मैंने पूर्ववत वेब एपीआई विधि के लिए एक एपीआई मार्ग तैयार किया और मैंने मार्ग में कार्रवाई पर 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

जब टाइप स्ट्रिंग के रूप में घोषित किया गया तो मुझे यह त्रुटि मिली। जब मैंने इसे बदलने के लिए काम करना शुरू किया

[HttpGet][Route("testClass/master/{Type:string}")]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.