डॉट चरित्र '।' एपीसी / लोगों / STAFF.45287 जैसे अनुरोध के लिए MVC वेब एपीआई 2 में


106

जिस URL पर मैं काम करने की कोशिश कर रहा हूं, वह शैली में एक है: http://somedomain.com/api/people/staff.33311 (LAST.FM जैसी साइटें अपने RESTFul और WebPage urls में सभी प्रकार के संकेतों की अनुमति देती हैं , उदाहरण के लिए " http://www.last.fm/artist/psy'aviah " LAST.FM के लिए एक वैध यूआरएल है)।

कौन से कार्य निम्नलिखित परिदृश्य में हैं: - http://somedomain.com/api/people/ - जो सभी लोगों को लौटाता है - http://somedomain.com/api/people/staff33311 - साथ ही काम करेगा, लेकिन यह वह नहीं है जो मैं ' मी के बाद मैं चाहता हूँ कि url एक "dot" को स्वीकार करे, जैसे नीचे दिए गए उदाहरण - http://somedomain.com/api/people/staff.33311 - लेकिन इससे मुझे एक

HTTP Error 404.0 - Not Found
The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.

मैंने निम्नलिखित चीजें स्थापित की हैं:

  1. नियंत्रक "PeopleController"

    public IEnumerable<Person> GetAllPeople()
    {
        return _people;
    }
    
    public IHttpActionResult GetPerson(string id)
    {
        var person = _people.FirstOrDefault(p => p.Id.ToLower().Equals(id.ToLower()));
        if (person == null)
            return NotFound();
    
        return Ok(person);
    }    
    
  2. WebApiConfig.cs

    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
    
        // Web API routes
        config.MapHttpAttributeRoutes();
    
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
    

मैं पहले से ही यह सब सुझावों का पालन करने की कोशिश की ब्लॉगपोस्ट http://www.hanselman.com/blog/ExperimentsInWackinessAllowingPercentsAnglebracketsAndOtherNaughtyThingsInTheASPNETIISRequestURL.aspx लेकिन यह अभी भी काम नहीं .. मैं भी सोचेंगे यह काफी थकाऊ है और मुझे आश्चर्य है अगर वहाँ नहीं है एक और, बेहतर और अधिक सुरक्षित तरीका है।

हमारे पास हमारी आईडी आंतरिक रूप से इस तरह है, इसलिए हमें डॉट को एक तरह से या किसी अन्य रूप में फिट करने के लिए एक समाधान खोजना होगा, अधिमानतः "की शैली में।" लेकिन अगर जरूरत हो तो मैं यूआरएल के लिए वैकल्पिक सुझाव के लिए खुला हूं ...


10
उत्तर नहीं है, लेकिन ऐसा क्यों है कि आपके लिए somedomain.com/api/people/staff.33311 के लिए 404 मिल रहा है - डिफ़ॉल्ट रूप से, IIS इस URL को देखता है और देखता है। फ़ाइल एक्सटेंशन के रूप में और अपने MVC एपीआई को दरकिनार करते हुए, स्थिर फ़ाइल हैंडलर को आमंत्रित करता है। आपके द्वारा स्वीकार किए गए उत्तर (सभी अनुरोधों के लिए सभी प्रबंधित मॉड्यूल चलाने) काम करता है क्योंकि आप IIS को ASP.NET पाइपलाइन (इसलिए, आपके नियंत्रकों) के माध्यम से जाने के लिए हर अनुरोध को मजबूर करते हैं
हेनरी सी

यहाँ से संबंधित पोस्ट ।
आरबीटी

जवाबों:


104

अपनी web.configफ़ाइल में सेटिंग करने के बाद अपनी समस्या ठीक करनी चाहिए:

<configuration>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true" />

4
इसने चाल चली। हालाँकि, क्या इस विकल्प को स्थापित करने से कोई भेद्यता है? यह मानक व्यवहार क्यों नहीं है?
यवेस शेल्पे

2
ठीक है, किसी की रुचि के लिए: मैं ऊपर दिए गए मेरे प्रश्न को उत्तर के रूप में यहां लिखे गए उत्तर (कपिल खंडेलवाल द्वारा उत्तर) पर देखा जा रहा हूं: stackoverflow.com/questions/11048863/…
यवेस शेल्पे

2
हां, यह काम कर गया, दूसरों को बस, मैं यह जानना चाहूंगा कि इस कार्य के लिए कौन से विशेष मॉड्यूल की आवश्यकता है?
ग्रेग ज़।

3
जब मैंने यह कोशिश की, तो यह केवल तभी काम करेगा जब मैं रास्ते के अंत में एक '/' डालूं। किसी भी सुझाव क्यों यह है? एक साइड नोट पर, नीचे दिया गया उत्तर विशेष रूप से सभी मॉड्यूल चलाने के बजाय 'UrlRoutModule' जोड़ता है, मेरे लिए भी काम किया है, हालांकि अभी भी इस मुद्दे के साथ कि इसे काम करने के लिए अंत में '/' की आवश्यकता है।
निकोलज डैम लार्सन

10
stackoverflow.com/a/12151501/167018 यदि आप संबंधित हैं (और ठीक से ऐसा है) तो यह देखने लायक है कि रनअल्लमेडमॉड्यूल्सफोरऑर्लेंस को सक्षम करने के प्रदर्शन प्रभाव के बारे में।
हेनरी सी

140

http://somedomain.com/api/people/staff.33311/इसके बजाय एक स्लैश जैसे URL के साथ प्रत्यय लगाएं http://somedomain.com/api/people/staff.33311


3
@AgustinMeriles मेरे उत्तर को वास्तविक उत्तर की तुलना में अधिक हल माना जा सकता है, यह आपके प्रश्न की व्याख्या पर निर्भर करता है।
डैनी व्रॉड

5
यह तब काम नहीं करता है, जब URL URL अनुभाग के अंत में / लोगों / सदस्य के रूप में होता है।
eYe

2
नहीं, क्या होगा अगर मैं अंत में एक स्लेश नहीं चाहता? इसकी आवश्यकता नहीं होनी चाहिए।
जोश एम।

1
@JoshM। यह एक वर्कअराउंड है, मैंने ASP.NET नहीं लिखा। इसके अलावा, स्लैश अनुरोध को प्रभावित नहीं करता है। हालांकि, यह आपके इरादों को google.com/my query goes here/बनाम के रूप में अधिक स्पष्ट बनाने में मदद करता है google.com/subDomain my query goes here
डैनी व्रॉद

1
हां यह सबसे अच्छा है जिसे आपको web.config को संशोधित नहीं करना चाहिए।
टिमोथी गोंजालेज

35

मैंने पाया है कि मानक को जोड़ने से पहले निम्नलिखित ExtensionlessUrlHandlerमेरे लिए समस्या हल करता है:

<add name="ExtensionlessUrlHandler-Integrated-4.0-ForApi"
     path="api/*"
     verb="*"
     type="System.Web.Handlers.TransferRequestHandler"
     preCondition="integratedMode,runtimeVersionv4.0" />

मुझे नहीं लगता कि नाम वास्तव में यह सब बहुत मायने रखता है, सिवाय इसके कि शायद आपकी आईडीई (मेरे मामले में विजुअल स्टूडियो) आपकी साइट कॉन्फ़िगरेशन का प्रबंधन कर रही है।

एच / टी से https://stackoverflow.com/a/15802305/264628


मैंने इसे 'स्टैंडर्ड लाइन' के बाद जोड़ा और यह ठीक काम भी कर गया।
जलाल एल-शेर

यह स्वीकृत उत्तर होना चाहिए।
Uri के

2
पहले के लिए धन्यवाद, क्योंकि यह काम नहीं कर रहा था!
Mese

मेरा मानना ​​है कि मॉड्यूल घोषणा के क्रम में चलते हैं, इसलिए हमेशा अधिक सामान्य लोगों के सामने अधिक विशिष्ट (या अधिक महत्वपूर्ण) वाले होते हैं।
ब्रायन

24

मुझे नहीं पता कि मैं वास्तव में क्या कर रहा हूं, लेकिन पिछले जवाब के साथ खेलने के बाद थोड़ा सा मैं दूसरे के साथ आया, शायद अधिक उपयुक्त, समाधान:

<system.webServer>
<modules>
    <remove name="UrlRoutingModule-4.0" />
    <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />
</modules>
</system.webServer>

धन्यवाद, मैं यह भी नहीं जानता कि यह क्या कर रहा है, लेकिन यह दूसरे समाधान से बेहतर है।
थॉमस

1
मॉड्यूल की सूची के अंत में url राउटिंग मॉड्यूल (जो कि यह पकड़ रहा है कि अनुरोध में एक एक्सटेंशन शामिल है और फिर इसे एक फ़ाइल के रूप में संभालने की कोशिश करता है) को स्थानांतरित करने के लिए प्रकट होता है, जो मॉड्यूल को एपीआई अनुरोध को संभालने के बाद इसे लगाने के लिए पर्याप्त है । IMHO, यह सबसे अच्छा समाधान है जो मैंने SO पर देखा है, कम से कम ATTOW
जेम्स मैनिंग

1
यह सूची के अंत तक स्थानांतरण नहीं है, यह डिफ़ॉल्ट पूर्व शर्त को हटाना है कि यह मॉड्यूल केवल प्रबंधित हैंडलर के लिए चलता है। डिफ़ॉल्ट कॉन्फ़िगरेशन इस प्रारूप का उपयोग करता है:<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="managedHandler" />
थीटा-मछली

धन्यवाद - जो व्यवहार की व्याख्या करेगा।
ग्रेग जेड

8

मैंने पाया कि मुझे केवल runAllManagedModulesForAllRequestsविशेषता सेट करने से अधिक करने की आवश्यकता है true। मुझे यह भी सुनिश्चित करना था कि सभी रास्तों को देखने के लिए विस्तार रहित URL हैंडलर को कॉन्फ़िगर किया गया था। इसके अलावा, एक और बोनस कॉन्फ़िगरेशन सेटिंग है जिसे आप जोड़ सकते हैं जो कुछ मामलों में मदद करेगा। यहाँ मेरा काम कर रहा है Web.config:

<system.web>
    <httpRuntime relaxedUrlToFileSystemMapping="true" />
</system.web>
<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    <handlers>
        <remove name="WebDAV" />
        <remove name="OPTIONSVerbHandler" />
        <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
        <add name="ExtensionlessUrlHandler-Integrated-4.0"  path="*" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
</system.webServer>

ध्यान दें, विशेष रूप से, कि ExtensionlessUrlHandler-Integrated-4.0इसकी pathविशेषता (उदाहरण के लिए) के *विपरीत सेट है *.


मैं बस से थोड़ा सा मिल गया path="*."। बस जिज्ञासु, क्या कारण है कि लोगों को सेट है path="*."?
जस्टिनपी

वास्तव में, मैंने इसे बदल दिया path="*"और एक समस्या थी क्योंकि हम अपने वेबएपीआई के साथ एक दस्तावेजीकरण साइट की मेजबानी कर रहे हैं और उस साइट पर .jpg, .png और एक्सटेंशन वाली अन्य फ़ाइलों के साथ समस्या थी।
जस्टिनपी 8

@ जस्टिनपी 8 क्या आपने भी सेट किया था <modules runAllManagedModulesForAllRequests="true" />? .NET को उन स्टैटिक फ़ाइलों को संभालना चाहिए।
जोश एम। १

1
हाँ। मैं घाव कर रहा हूँ। मुझे वास्तव में यह पसंद नहीं है क्योंकि अब सभी स्थिर फाइलें .NET पाइपलाइन से गुजरती हैं। सौभाग्य से, क्योंकि यह एक वेबएपीआई सेवा है, केवल एपीआई डॉक्स / हेल्पर साइट के लिए स्वैगर और स्वशबकल सामान प्रभावित होते हैं।
जस्टिनपी 8

मैंने पाया कि इसने सभी स्थिर फ़ाइल अनुरोधों को तोड़ दिया। त्रुटि 500. मैं runAllManaged था ... सच पर सेट।
सैम

2

मैं इस स्थिति में फंस गया लेकिन / URL के अंत में अपील करना मेरे लिए साफ नहीं था।

तो बस नीचे web.config handlers टैग में जोड़ें और आप जाने के लिए अच्छा होगा।

<add name="Nancy" path="api" verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" allowPathInfo="true" />

क्या आप बता सकते हैं कि नैन्सी क्या है और क्या यह परियोजना में शामिल की जाने वाली लाइब्रेरी है? धन्यवाद!
नीले

1

मैंने पाया कि दोनों तरह से मेरे लिए काम करता है: या तो runAllManagedModulesForAllRequests को सही पर सेट करना या निम्नलिखित के रूप में ExtentionlessUrlHandler जोड़ना। अंत में मैं एक्सटेंशन को जोड़ने का विकल्प चुनता हूं क्योंकि runAllManagedModulesForAllRequests के बाद से साइट पर प्रदर्शन प्रभाव पड़ता है।

<handlers>
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <remove name="OPTIONSVerbHandler" />
  <remove name="TRACEVerbHandler" />
  <remove name="WebDAV" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*" verb="*" 
       type="System.Web.Handlers.TransferRequestHandler" 
       preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>

1

मैं Web.config फ़ाइल में इसका उपयोग करूंगा:

<add name="ManagedSpecialNames" path="api/people/*" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

मानक से पहले "ExtensionlessUrlHandler"।

उदाहरण के लिए मेरे मामले में मैंने इसे यहाँ रखा है:

<handlers>
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <remove name="OPTIONSVerbHandler" />
  <remove name="TRACEVerbHandler" />
  <add name="ManagedFiles" path="api/people/*" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>

इसलिए आप इस तरह के पैटर्न के URL को अनुप्रयोग प्रबंधन ट्री में मानक प्रबंधन के बजाय फाइलों के रूप में प्रबंधित करने के लिए बाध्य करते हैं।


0

मैंने बहुत ही समस्या का सामना किया और जिन परिस्थितियों में मैं आईआईएस और वेबसाइट कॉन्फिग संबंधित सेटिंग्स के साथ खेलने वाला नहीं था, वहां था। इसलिए मुझे इसे केवल कोड स्तर पर परिवर्तन करके काम करना था।

सरल बिंदु यह है कि सबसे आम मामला जहां आप URL में डॉट कैरेक्टर रखते हैं, वह तब होता है जब आपको उपयोगकर्ता से कुछ इनपुट मिलते हैं और इसे एक्शन स्ट्रिंग के तौर पर पास करते हैं या एक्शन विधि में मापदंडों पर कुछ तर्क पारित करने के लिए खंडित कर देते हैं अपने नियंत्रक के।

public class GetuserdetailsbyuseridController : ApiController
{
     string getuserdetailsbyuserid(string userId)
     {
        //some code to get user details
     }
}

नीचे दिए गए URL पर एक नज़र डालें जहाँ उपयोगकर्ता अपना व्यक्तिगत विवरण प्राप्त करने के लिए अपने उपयोगकर्ता आईडी में प्रवेश करता है:

http://mywebsite:8080/getuserdetailsbyuserid/foo.bar

चूँकि आपको सर्वर से कुछ डेटा प्राप्त करना है जिसे हम HTTP GETवर्ब का उपयोग करते हैं । GETकॉल का उपयोग करते समय किसी भी इनपुट पैरामीटर को केवल URL टुकड़ों में ही पास किया जा सकता है।

इसलिए अपनी समस्या को हल करने के लिए मैंने अपनी कार्रवाई की http क्रिया को बदल दिया POST। Http POSTक्रिया में शरीर में किसी भी उपयोगकर्ता या गैर-उपयोगकर्ता इनपुट को पारित करने की सुविधा है। इसलिए मैंने एक JSON डेटा बनाया और इसे http के शरीर में पास कर दियाPOST अनुरोध :

{
  "userid" : "foo.bar"
}

नीचे के रूप में अपनी विधि परिभाषा बदलें:

public class GetuserdetailsbyuseridController : ApiController
{
     [Post]
     string getuserdetailsbyuserid([FromBody] string userId)
     {
        //some code to get user details
     }
}

नोट : GETक्रिया का उपयोग करने के लिए और यहाँPOST क्रिया का उपयोग करने के लिए और अधिक ।


यदि आप REST API का निर्माण कर रहे हैं तो उचित समाधान नहीं है।
मुस्तफा ओज़्तर्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.