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


88

यह त्रुटि बहुत आम है, और मैंने सभी समाधानों की कोशिश की और उनमें से गैर काम किया। मैंने WebDAV प्रकाशन को नियंत्रण कक्ष में अक्षम कर दिया है और इसे मेरी वेब कॉन्फ़िगरेशन फ़ाइल में जोड़ दिया है:

  <handlers>
  <remove name="WebDAV"/>
  </handlers>
  <modules runAllManagedModulesForAllRequests="true">
  <remove name="WebDAVModule"/>
  </modules>

त्रुटि अभी भी बनी हुई है। यह नियंत्रक है:

   static readonly IProductRepository repository = new ProductRepository();

    public Product Put(Product p)
    {
        return repository.Add(p);
    }

विधि कार्यान्वयन:

 public Product Add(Product item)
    {
        if (item == null)
        {
            throw new ArgumentNullException("item");
        }
        item.Id = _nextId++;
        products.Add(item);
        return item;
    }

और यह वह जगह है जहाँ अपवाद फेंका गया है:

client.BaseAddress = new Uri("http://localhost:5106/");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));      
var response = await client.PostAsJsonAsync("api/products", product);//405 exception

कोई सुझाव?

जवाबों:


61

आप ग्राहक से पोस्ट कर रहे हैं:

await client.PostAsJsonAsync("api/products", product);

पोटिंग नहीं।

आपकी वेब API विधि केवल PUT अनुरोध स्वीकार करती है।

इसलिए:

await client.PutAsJsonAsync("api/products", product);

त्रुटि 'HttpClient' में 'PostAsJsonAsync' की परिभाषा नहीं है, जब आपके कोड की कोशिश की जाती है।
AgileDev

61

मेरे पास एक ही अपवाद था। मेरी समस्या यह थी कि मैंने उपयोग किया था:

using System.Web.Mvc; // Wrong namespace for HttpGet attribute !!!!!!!!!
[HttpGet]
public string Blah()
{
    return "blah";
}

होना चाहिए

using System.Web.Http; // Correct namespace for HttpGet attribute !!!!!!!!!
[HttpGet]
public string Blah()
{
    return "blah";
}

18

मैंने DELETE मेथड वर्क को प्राप्त करने के लिए बहुत सी कोशिश की (मैं 405 मेथड को वेब एपीआई की अनुमति नहीं दे रहा था), और अंत में मैंने अपने कंट्रोलर के लिए [रूट ("एपीआई / स्कैन / {आईडी}") जोड़ा और काम ठीक था। उम्मीद है कि यह पोस्ट किसी एक की मदद करेगी।

     // DELETE api/Scan/5
    [Route("api/scan/{id}")]
    [ResponseType(typeof(Scan))]
    public IHttpActionResult DeleteScan(int id)
    {
        Scan scan = db.Scans.Find(id);
        if (scan == null)
        {
            return NotFound();
        }

        db.Scans.Remove(scan);
        db.SaveChanges();

        return Ok(scan);
    }

किसी कारण से यह हटाने के लिए और इसे ठीक करने के लिए, यह केवल हटाने के लिए काम नहीं कर रहा था। खैर, मैंने अभी जोड़ा [HttpPost] और इसने काम किया। लेकिन धन्यवाद, आपने मुझे सही रास्ते पर ले लिया और केवल अब मुझे 5 मिनट का समय लग गया :)
रूबेनिज्म

1
आप सिर्फ [HttpDelete] विशेषता क्यों नहीं जोड़ रहे हैं?
जॉनी 5

14

मेरी समस्या WebAPI में विशेषता रूटिंग में बदल गई। मैंने एक कस्टम रूट बनाया, और इसे वेबएपीआई के बजाय एक जीईटी की तरह माना, यह एक POST था

    [Route("")]
    [HttpPost] //I added this attribute explicitly, and it worked
    public void Post(ProductModel data)
    {
        ...
    }

मुझे पता था कि इसे मूर्खतापूर्ण होना चाहिए (जो आपके पूरे दिन का उपभोग करता है)


इससे मेरा दिन बच गया!
फाटे 01

6

Chrome अक्सर OPTIONSपोस्ट करने से पहले कॉल करने की कोशिश करता है । यह सुनिश्चित करने के लिए ऐसा करता है कि कोर हेडर क्रम में हैं। यह समस्याग्रस्त हो सकता है यदि आप OPTIONSअपने एपीआई नियंत्रक में कॉल को संभाल नहीं रहे हैं ।

public void Options() { }

6

यह त्रुटि तब भी हो सकती है जब आप http से कनेक्ट करने का प्रयास करते हैं जब सर्वर https पर होता है।

यह थोड़ा भ्रमित करने वाला था क्योंकि मेरे गेट-रिक्वेस्ट ठीक थे, समस्या केवल पोस्ट-रिक्वेस्ट के साथ मौजूद थी।


4

मुझे अपने GET कॉल पर 405 मिल रहा था, और समस्या यह थी कि मैंने GET सर्वर-साइड पद्धति में पैरामीटर का नाम दिया था Get(int formId), और मुझे रूट बदलने, या उसका नाम बदलने की आवश्यकता थी Get(int id)


4

यदि आपकी विधि किसी पैरामीटर की अपेक्षा कर रही है और आप इसे पारित नहीं कर रहे हैं, तो आप 405 त्रुटि भी प्राप्त कर सकते हैं।

यह काम नहीं करता है (405 त्रुटि)

HTML देखें / जावास्क्रिप्ट

$.ajax({
         url: '/api/News',
         //.....

वेब एप:

public HttpResponseMessage GetNews(int id)

इस प्रकार यदि विधि हस्ताक्षर ऊपर जैसा है तो आपको अवश्य करना चाहिए:

HTML देखें / जावास्क्रिप्ट

$.ajax({
         url: '/api/News/5',
         //.....

मुझे लगता है कि विभिन्न कारणों से 405 त्रुटियां चल रही हैं, वे सभी इस तथ्य को उबालते हैं कि विधि हस्ताक्षर और एक पैरामीटर मुद्दा या एक सम्मेलन का नामकरण मुद्दा या एक गुण मुद्दा आदि का प्रयास कर रहा है ...
टॉम स्टिकेल

4

मुझे इस पार्टी के लिए देर हो गई है लेकिन जैसा कि ऊपर कुछ भी व्यवहार्य नहीं था या ज्यादातर मामलों में काम कर रहा था, यहां बताया गया है कि यह आखिरकार मेरे लिए कैसे हल हुआ।

सर्वर पर साइट / सेवा को होस्ट किया गया था, एक सुविधा की आवश्यकता थी! HTTP गतिविधि !!!

सर्वर प्रबंधक> प्रबंधित करें> भूमिकाएँ और सुविधाएँ जोड़ें> अगली बार जब तक आप सुविधाएँ> अंडर। नेट (प्रत्येक संस्करण) से HTTP एक्टिवेशन पर टिक करें। यह भी ध्यान दें कि एक> नेट> डब्ल्यूसीएफ सर्विसेज के तहत एक छिपा हुआ है।

यह तो तुरंत काम किया! वह मेरे दिमाग को पिघला रहा था


4

यदि आपके पास एक मार्ग है

[Route("nuclearreactors/{reactorId}")]

आपको विधि में ठीक उसी पैरामीटर नाम का उपयोग करने की आवश्यकता है जैसे

public ReactorModel GetReactor(reactorId)
{
 ...
}

यदि आप ठीक उसी पैरामीटर को पास नहीं करते हैं, तो आपको "405 पद्धति की अनुमति नहीं है" त्रुटि मिल सकती है क्योंकि मार्ग अनुरोध से मेल नहीं खाएगा और वेबएपी अलग अनुमत HTTP विधि के साथ एक अलग नियंत्रक विधि से टकराएगा।


यह भी कोई जवाब नहीं है!
दिव्यांग देसाई

@Div "405 मेथड इजाजत नहीं" को मैंने साझा किए गए मामले में दिखाया जा सकता है क्योंकि विधि एफी-कॉल को नहीं पकड़ेगी क्योंकि मार्ग सेटअप अमान्य है। एपीआई-कॉल फिर एक और अनपेक्षित विधि से टकरा सकती है, जो एक अलग HTTP कार्रवाई की अनुमति दे सकती है। हाँ, मैं मानता हूँ कि यह उत्तर वास्तविक प्रश्न के लिए १००% प्रासंगिक नहीं हो सकता है, हालाँकि ज़ारदास द्वारा प्रश्न का शीर्षक बहुत विशिष्ट नहीं है और मेरा मानना ​​है कि शीर्षक द्वारा बताए गए प्रश्न के उत्तर की तलाश में कई लोग यहाँ उतर रहे हैं। इस उत्तर को उपयोगी समझें।
roylac


3

यह आपके विशिष्ट प्रश्न का उत्तर नहीं देता है, लेकिन जब मुझे वही समस्या थी तो मैं यहां समाप्त हो गया और मुझे लगा कि अधिक लोग भी ऐसा कर सकते हैं।

मेरे पास समस्या यह थी कि मैंने अपनी गेट विधि को स्थैतिक रूप से घोषित कर दिया था । मुझे यह पूरी तरह से याद आया, और इसने विशेषताओं या समान से कोई चेतावनी नहीं दी।

गलत:

public class EchoController : ApiController
{
    public static string Get()
    {
        return string.Empty;
    }
}

सही बात:

public class EchoController : ApiController
{
    public string Get()
    {
        return string.Empty;
    }
}

2

[HttpPost] अनावश्यक है!

[Route("")]
public void Post(ProductModel data)
{
    ...
}

1
हां जिस तरह से आप यह कर रहे हैं वह सही है कि आपको एक स्पष्ट [HttpPost] की आवश्यकता नहीं है, हालांकि कुछ लोग सम्मेलन (yikes) का पालन नहीं कर रहे हैं और इस तरह कुछ [मार्ग ("MyMethodSaver") सार्वजनिक स्ट्रिंग MyMethodtoSave (int? आईडी) -> जिसके लिए [HttpPost] की आवश्यकता होगी और यह तब काम करेगा
टॉम स्टिकेल

2

मैं इसे हल नहीं कर सका। जब तक POST लौटाया (ASP.NET 4.0 - WEBAPI 1) मैं कोर को सक्षम और काम कर रहा था। जब मैंने एक HttpResponseMessage को वापस करने की कोशिश की, तो मुझे HTTP 405 प्रतिक्रिया मिलनी शुरू हो गई।

ऊपर Llad की प्रतिक्रिया के आधार पर, मैंने अपने स्वयं के संदर्भों पर एक नज़र डाली।

मेरे पास मेरे POST विधि के ऊपर सूचीबद्ध [[System.Web.Mvc.HttpPost] विशेषता थी।

मैंने इसे उपयोग करने के लिए बदल दिया है:

[System.Web.Http.HttpPostAttribute]
[HttpOptions]
public HttpResponseMessage Post(object json)        
{
    ...
    return new HttpResponseMessage { StatusCode = HttpStatusCode.OK };
}

इससे मेरी परेशानी ठीक हो गई। मैं उम्मीद करता हूं कि इससे किसी की मदद होगी।

पूर्णता की खातिर, मैं अपने वेब में निम्नलिखित था।

<httpProtocol>
    <customHeaders>
        <clear />
        <add name="Access-Control-Expose-Headers " value="WWW-Authenticate"/>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, PATCH, DELETE" />
        <add name="Access-Control-Allow-Headers" value="accept, authorization, Content-Type" />
        <remove name="X-Powered-By" />
    </customHeaders>
</httpProtocol>

यह विकल्प पूर्व-उड़ान अनुरोध (साथ ही POST) पर बुलाया जाएगा, जिस बिंदु jsonपर संभावना है कि nullपूर्व-उड़ान अनुरोधों में आमतौर पर पेलोड नहीं होता है, या आप पोस्ट कार्रवाई दो बार चलाएंगे।
Glennsl

1

हमारे पास एक समान मुद्दा था। हम इससे प्राप्त करने की कोशिश कर रहे थे:

[RoutePrefix("api/car")]
public class CarController: ApiController{

    [HTTPGet]
    [Route("")]
    public virtual async Task<ActionResult> GetAll(){

    }

}

तो हम करेंगे .GET("/api/car")और यह एक फेंक देंगे 405 error


जोड़:

CarController.csफ़ाइल निर्देशिका में था/api/car इसलिए जब हम इस एपीआई endpoint अनुरोध कर रहे थे, आईआईएस एक त्रुटि वापस भेज क्योंकि यह देखा है कि हम एक वर्चुअल निर्देशिका है कि हम की अनुमति नहीं थी पहुंचने का प्रयास कर रहे थे।

विकल्प 1: निर्देशिका को बदलें / नाम बदलें नियंत्रक
2 विकल्प में है: रूट उपसर्ग को उस चीज से बदलें जो वर्चुअल निर्देशिका से मेल नहीं खाती है।


1

मेरे मामले में मेरे पास वेबपीआई मार्ग (पूर्व सैंडबॉक्स) के समान नाम वाला प्रोजेक्ट में एक भौतिक फ़ोल्डर था और केवल IIS (स्पष्ट रूप से) में स्थिर फ़ाइलों के हैंडलर द्वारा POST अनुरोध को अवरोधन किया गया था।

अधिक 404 की अपेक्षा भ्रामक 405 त्रुटि प्राप्त करना, यही कारण था कि मुझे समस्या निवारण में लंबा समय लगा।

इस में गिरना आसान नहीं है, लेकिन संभव है। आशा है कि यह किसी की मदद करता है।


1

मेरे हिस्से के लिए मेरा POST हैंडलर इस रूप में था:

[HttpPost("{routeParam}")]
public async Task<ActionResult> PostActuality ([FromRoute] int routeParam, [FromBody] PostData data)

मुझे पता चला कि मुझे तर्कों को स्वैप करना है , अर्थात् शरीर डेटा को पहले रूट पैरामीटर कहना है, जैसे कि:

[HttpPost("{routeParam}")]
public async Task<ActionResult> PostActuality ([FromBody] PostData data, [FromRoute] int routeParam)

0

अपनी परियोजना .csproj फ़ाइल और परिवर्तन की जाँच करें

<IISUrl>http://localhost:PORT/</IISUrl>

अपनी वेबसाइट के लिए इस तरह यूआरएल

<IISUrl>http://example.com:applicationName/</IISUrl>

0

एक और संभव मुद्दा जो समान व्यवहार का कारण बनता है वह रूटिंग में डिफ़ॉल्ट पैरामीटर है। मेरे मामले में नियंत्रक स्थित था और सही ढंग से चालू था, लेकिन डिफ़ॉल्ट Getकार्रवाई निर्दिष्ट होने के कारण POST अवरुद्ध था :

config.Routes.MapHttpRoute(
    name: "GetAllRoute",
    routeTemplate: "api/{controller}.{ext}"/*,
    defaults: new { action = "Get" }*/ // this was causing the issue
);

0

मुझे बिल्कुल वही समस्या हो रही थी। मैंने दो घंटे तक देखा कि क्या गलत नहीं था जब तक मुझे एहसास नहीं हुआ कि मैं अपने POSTतरीके के privateबजाय public

अब यह देखकर कि त्रुटि संदेश सामान्य है। आशा करता हूँ की ये काम करेगा!


0

सुनिश्चित करें कि आपका नियंत्रक Controllerवर्ग से विरासत में मिला है ।

यह भी पागल हो सकता है कि सामान उस के बिना भी स्थानीय रूप से काम करेगा।

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