वेबएपीआई काम नहीं कर रहा है - 405 विधि अनुमति नहीं है


120

मैं इस पर किसी भी मदद की सराहना करता हूं क्योंकि साइट आज रात को लाइव होने वाली है!

मेरे पास एक डिलीट विधि वाला एक वेब एपि कंट्रोलर है। यह विधि IIS एक्सप्रेस (विंडोज 8) पर चलने वाली मेरी स्थानीय मशीन पर ठीक-ठीक निष्पादित होती है, लेकिन जैसे ही मैंने इसे लाइव IIS सर्वर (Windows Server 2008 R2) पर तैनात किया, यह काम करना बंद कर देता है और निम्न त्रुटि संदेश फेंकता है:

HTTP त्रुटि 405.0 - विधि अनुमत नहीं है जिस पृष्ठ को आप खोज रहे हैं वह प्रदर्शित नहीं किया जा सकता क्योंकि अमान्य विधि (HTTP क्रिया) का उपयोग किया जा रहा है

मैंने समाधानों के लिए वेब के चारों ओर देखा है और मैंने सबसे उचित लोगों को लागू किया है। मेरे वेब कॉन्फ़िगरेशन में निम्नलिखित सेटिंग्स हैं:

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
<handlers>
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="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>

मैंने भी कोई फायदा नहीं हुआ IIS में हैंडलर मैपिंग और रिक्वेस्ट फ़िल्टरिंग को बदलने की कोशिश की है। कृपया ध्यान दें कि IIS में WebDAV संलेखन नियम अक्षम होने लगता है।

किसी भी विचार बहुत सराहना की जाएगी धन्यवाद।

जवाबों:


199

मैंने आखिरकार समाधान ढूंढ लिया! यदि आप एक ही मुद्दे पर आते हैं, तो अपने web.config में निम्नलिखित जोड़ें

<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/> <!-- ADD THIS -->
    </modules>
    ... rest of settings here

आशा है कि ये आपकी मदद करेगा


2
मैं भी के अनुसार संचालकों अनुभाग में एक निकालें जोड़ने के लिए किया था stackoverflow.com/a/6698096/254156
rrrr

3
यहां भी काम किया। लेकिन क्या कोई मुझे WebDAVModule के संबंध समझा सकता है?
बोस एनक्लर

11
उन लोगों के लिए जो केवल कॉपी-पेस्ट करते हैं: runAllManagedModulesForAllRequests = "true" वास्तव में आवश्यक नहीं है और वास्तव में अन्य चीजों को तोड़ सकता है।
ज़ार शारदान

कुछ अन्य वेब पोस्ट्स IIS मॉड्यूल्स सेक्शन का उपयोग करके मॉड्यूल को हटाने का सुझाव देंगे, यह इसे निष्क्रिय कर देता है लेकिन फिर भी यह / इसी तरह की समस्या का कारण बनता है, यह सबसे विश्वसनीय तरीका है
एंथनी मेन

4
@ZarShardan (और अन्य) FYI करें: यदि आप runAllManagedModulesForAllRequests = "true" विशेषता को निकालते हैं, तो आपको <हैंडलर> नोड के तहत <remove name = "WebDAV" /> को भी जोड़ना होगा।
आरोन

65

कुछ मामलों में इसे सिर्फ मॉड्यूल से हटाने से अगली त्रुटि उत्पन्न हो सकती है:

500.21 हैंडलर "WebDAV" की मॉड्यूल सूची में एक खराब मॉड्यूल "WebDAVModule" है

मॉड्यूल: IIS वेब कोर अधिसूचना: ExecuteRequestHandler "

समाधान यहाँ सुझाया गया था । साथ ही इसे हैंडलर से हटाने की जरूरत है।

<system.webServer>
    <modules>
        <remove name="WebDAVModule" />
    </modules>
    <handlers>
        <remove name="WebDAV" />
    </handlers>
</system.webServer>

1
यह मेरे लिए काम करता है, लेकिन क्या कोई WebDAV वास्तव में कुछ प्रकाश डाल सकता है?
नाजरुल मुहामिन

31

मेरे मामले में उपरोक्त समाधानों में से कोई भी काम नहीं कर रहा था। ऐसा इसलिए था क्योंकि मैंने अपनी विधि में पैरामीटर का नाम बदल दिया था Delete

मैं था

public void Delete(string Questionid)

के बजाय

public void Delete(string id)

मुझे idनाम का उपयोग करने की आवश्यकता है क्योंकि यह वह नाम है जो मेरी WebApiConfigफ़ाइल में घोषित किया गया है । idतीसरी और चौथी पंक्ति में नाम नोट करें :

            config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

इसका समाधान मुझे यहीं से मिला ।


15

HTTP DELETEक्रिया के लिए जावास्क्रिप्ट इस तरह होना चाहिए:

$.ajax({
    **url: "/api/SomeController/" + id,**
    type: "DELETE",
    dataType: "json",
    success: function(data, statusText) {
        alert(data);
    },
    error: function(request, textStatus, error) {
        alert(error);
        debugger;
    }
});

है कुछ इस तरह का उपयोग करें:

...
data: {id:id}
...

जब आप POSTविधि का उपयोग करते हैं ।


1
हाय @Pavel, यह सही है यदि आप वास्तव में पूरी तरह से Restful कार्यान्वयन का उपयोग कर रहे हैं। दुर्भाग्य से, हर कोई ऐसा नहीं करता है और डेवलपर्स को DELETE आदि के बजाय POST का उपयोग करते हुए देखना काफी आम है। इसे स्पष्ट करने के लिए धन्यवाद।
क्रिस

5

यहाँ लगभग हर समाधान की कोशिश करने के बाद यह मेरे लिए काम किया। इसे अपनी API कॉन्फिग फाइल में जोड़ें

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

बहुत सारी चीजों की कोशिश की, यह काम किया। .NET संस्करण 4.6.1 - धन्यवाद।
केतन

4

यदि आप IIS 7.0 या बाद के संस्करण का उपयोग कर रहे हैं। यह समस्या मुख्य रूप से IIS सर्वर पर WebDAV एक्सटेंशन मॉड्यूल से संबंधित है। पोस्ट या डिलीट एक्शन का उपयोग करते समय ऐसा हुआ।

कृपया वेब कॉन्फ़िगरेशन में सेटिंग के नीचे प्रयास करें

<system.webServer>
   <modules>
       <remove name="WebDAVModule" />
   </modules>
   <handlers>
     <remove name="WebDAV" />
   </handlers>
</system.webServer>

3

मुझे भी यही समस्या थी, मैं WebAPi को कॉल कर रहा हूं और यह त्रुटि हो रही है। सेवाओं के लिए web.config में निम्नलिखित कॉन्फ़िगरेशन जोड़ने से मेरी समस्या हल हो गई

    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/> <!-- add this -->
    </modules>

web.config फ़ाइल में मेरी समस्या हल हो गई। यह है कि कैसे मैं ग्राहक की ओर से बुला रहा था

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri(environment.ServiceUrl);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    HttpResponseMessage response = client.DeleteAsync("api/Producer/" + _nopProducerId).Result;
    if (response.IsSuccessStatusCode)
    {
        string strResult = response.Content.ReadAsAsync<string>().Result;
    }
}

2

ApplicationHost.config पर जाएं (आमतौर पर C: \ Windows \ System32 \ inetsrv \ config) फ़ाइल के नीचे और आवेदन में निम्नलिखित पंक्ति पर टिप्पणी करें। Host.config

1) अंडर हैंडर्स>:

<add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />

2) उपरोक्त मॉड्यूल द्वारा <मॉड्यूल> के तहत संदर्भित किए जा रहे निम्न मॉड्यूल पर भी टिप्पणी करें

<add name="WebDAVModule" />

या अन्य उत्तर stackoverflow.com/a/47907578/1754743 का उपयोग करके इन हैंडलर को अपने ही web.config में रिमूव करें, यदि आप मशीन-वाइड कॉन्फिग फ़ाइल को संशोधित नहीं करना चाहते (या नहीं कर सकते हैं)
Ekus

2

मेरे मामले में, मैं जोड़ने के लिए याद किया {id}करने के लिए [Route("")]और मैं एक ही त्रुटि मिली। मेरे लिए इस समस्या को जोड़ना:[Route("{id}")]


इतने घंटों का समय बर्बाद किया है, और अगर यह तुम्हारे लिए नहीं था तो भी मैं इसे हल नहीं कर सका .... मुझे आश्चर्य है कि यह 404 क्यों नहीं लौटता है: @
deadManN

1

मेरे पास 405 त्रुटि विधि नहीं थी क्योंकि मैं WebApi नियंत्रक को हटाने की विधि को सार्वजनिक करने के लिए छोड़ दिया था।

मुझे इसे खोजने में बहुत समय लगा (बहुत लंबा!) क्योंकि मुझे इस मामले में Not Found त्रुटि की उम्मीद थी, इसलिए मैं गलत तरीके से यह मान रहा था कि मेरे डिलीट मेथड को नकारा जा रहा है।

Not Not के बजाय Not Allowed का कारण यह है कि मेरे पास उसी मार्ग के लिए एक Get विधि भी थी (जो कि REST को लागू करते समय सामान्य स्थिति होगी)। सार्वजनिक गेट फ़ंक्शन को रूटिंग द्वारा मिलान किया जाता है और फिर गलत HTTP पद्धति के कारण अस्वीकृत कर दिया जाता है।

एक साधारण त्रुटि जो मुझे पता है लेकिन यह किसी और को कुछ समय बचा सकती है।


1

बस जोड़ना है। यदि यह आपका कॉन्फिग है

config.Routes.MapHttpRoute (
            नाम: "DefaultApi",
            मार्गटेम्पलेट: "एपी / {कंट्रोलर} / {आईडी}",
            चूक: नया {आईडी = मार्गपरिवर्तन। वैकल्पिक}

कृपया करते रहें, जैसा कि ह्यूगो ने कहा, और कंट्रोलर मेथड के लिए रूट एट्रिब्यूट सेट न करें, इससे मेरे मामले में समस्या आ गई।


0

मेरे पास भी ऐसा ही मुद्दा था लेकिन PUT के लिए - मेरे लिए अन्य सुझावों में से किसी ने भी काम नहीं किया।

हालाँकि मैं आईडी के लिए intडिफ़ॉल्ट के बजाय उपयोग कर रहा था string{id:int}मार्ग में जोड़ने से मेरी समस्या हल हो गई।

    [Route("api/Project/{id:int}")]
    public async Task<IHttpActionResult> Put(int id, [FromBody]EditProjectCommand value)
    {
       ...
    }

0

हमें अपने वेब पर कस्टम हेडर जोड़ना था। हमारे अनुरोध में कई हेडर थे जो एपीआई प्रतिक्रिया को भ्रमित करते थे।

<httpProtocol>
    <customHeaders>
        <remove name="Access-Control-Allow-Methods" />
        <remove name="Access-Control-Allow-Origin" />
        <remove name="Access-Control-Allow-Headers" />
    </customHeaders>
</httpProtocol>

-1

हटाना विधि के शीर्ष पर [HttpPost] विशेषता ने मेरे लिए इस समस्या को हल किया:

[HttpPost]
public void Delete(int Id)
{
  //Delete logic
}

यह एक कारण हो सकता है कि यह आपके लिए क्यों काम कर रहा है। मैं एक पुराने संस्करण पर था, 2013 की शुरुआत में, इसलिए काफी कुछ चीजें तय हो गई हैं। खुशी है कि यह आपके लिए काम कर रहा है।
क्रिस

4
यह ईमानदार होने के लिए एक अच्छा जवाब नहीं है। जिन लोगों की समस्या का समाधान किया गया था, वे DELETE के बजाय POST का उपयोग कर रहे हैं, इसलिए यह काम नहीं कर सकता है
अलेक्जेंडर डर्क

मेरा मानना ​​है कि यह इसलिए है क्योंकि आप data(यानी अनुरोध के निकाय) का उपयोग कर रहे हैं (यानी अनुरोध paramsका यूआरएल) ग्राहक पक्ष में।
थॉमस सॉजावन

मैं अलेक्जेंडर डर्क के साथ सहमत हूं, यह एक समाधान के बजाय एक कीचड़ है।
बासेम सईज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.