405 পদ্ধতিতে ওয়েব এপিআই অনুমোদিত নয়


90

এই ত্রুটিটি খুব সাধারণ, এবং আমি সমাধানগুলির সমস্তগুলি চেষ্টা করেছিলাম এবং সেগুলির মধ্যেও না কাজ করে। আমি কন্ট্রোল প্যানেলে ওয়েবএডিএভি প্রকাশনা অক্ষম করেছি এবং এটি আমার ওয়েব কনফিগারেশনে যুক্ত করেছি:

  <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

কোনও পরামর্শ?

উত্তর:


62

আপনি ক্লায়েন্টের কাছ থেকে পোস্ট করছেন:

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

পুটিং নয়

আপনার ওয়েব এপিআই পদ্ধতিটি কেবল পুট অনুরোধগুলি গ্রহণ করে।

সুতরাং:

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

আপনার কোডটি চেষ্টা করার পরে ত্রুটি 'এইচটিপিপিএলিয়েন্ট'-এ' পোস্টএএসজেসনসায়েন্স 'ছোঁড়ার জন্য কোনও সংজ্ঞা নেই।
চটজলদিদেভ

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

আমি ডিলেট ডিগ্রি পদ্ধতিতে কাজ পেতে অনেক চেষ্টা করেছি (আমি 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);
    }

কিছু কারণে আমার এটি মুছে ফেলার জন্য কাজ করছে না, এটি তৈরি এবং আপডেট করার জন্য এটি দুর্দান্ত কাজ করেছে। ঠিক আছে, আমি স্রেফ [এইচটিটিপিপোস্ট] যুক্ত করেছি এবং এটি কার্যকর হয়েছে। তবে ধন্যবাদ, আপনি আমাকে সঠিক পথে
পৌঁছেছেন

4
আপনি কেবল [এইচটিপিডিলেট] বৈশিষ্ট্যটি যুক্ত করছেন না কেন?
জননি 5

14

আমার সমস্যাটি ওয়েবএপিআইতে অ্যাট্রিবিউট রাউটিং হিসাবে পরিণত হয়েছে। আমি একটি কাস্টম রুট তৈরি করেছি এবং এটি ওয়েব পোস্টের পরিবর্তে এটি একটি পোস্ট হিসাবে আবিষ্কার করে GET এর মতো ব্যবহার করে like

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

আমি জানতাম এটি কিছু নিরীহ হতে হবে (এটি আপনার পুরো দিন গ্রাস করে)


এটা আমার দিন বাঁচায়!
Phet01

6

ক্রোম প্রায়শই OPTIONSএকটি পোস্ট করার আগে একটি কল করার চেষ্টা করে । এটি সিওআরএস শিরোলেখ ক্রমযুক্ত তা নিশ্চিত করার জন্য এটি করে। আপনি OPTIONSযদি আপনার API কন্ট্রোলারে কল পরিচালনা না করে থাকেন তবে সমস্যা হতে পারে ।

public void Options() { }

6

সার্ভারটি https এ থাকা অবস্থায় আপনি HTTP- র সাথে সংযোগ দেওয়ার চেষ্টা করার সময়ও এই ত্রুটিটি দেখা দিতে পারে।

এটি কিছুটা বিভ্রান্তিকর কারণ আমার প্রাপ্তি-অনুরোধগুলি ঠিক ছিল, সমস্যাটি কেবল পোস্ট-অনুরোধগুলির সাথে উপস্থিত ছিল।


4

আমি আমার জিইটি কলটিতে ৪০৫ পাচ্ছিলাম, এবং সমস্যাটি দেখা গেল যে আমি জিইটি সার্ভার-সাইড পদ্ধতিতে প্যারামিটারটির নাম Get(int formId)রেখেছি এবং আমার রুটটি পরিবর্তন করার বা নাম পরিবর্তন করার দরকার পড়ে Get(int id)


4

আপনার পদ্ধতিটি যদি কোনও প্যারামিটারের প্রত্যাশা করে এবং আপনি এটি পাস না করেন তবে আপনি 405 ত্রুটিটিও পেতে পারেন।

এটি কাজ করে না (405 ত্রুটি)

এইচটিএমএল ভিউ / জাভাস্ক্রিপ্ট

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

ওয়েব অপি:

public HttpResponseMessage GetNews(int id)

সুতরাং যদি পদ্ধতিটির স্বাক্ষর উপরের মত হয় তবে আপনাকে অবশ্যই এটি করতে হবে:

এইচটিএমএল ভিউ / জাভাস্ক্রিপ্ট

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

আমি বিভিন্ন কারণে 405 ত্রুটির মধ্যে চলেছি বলে মনে হচ্ছে, তারা পদ্ধতিটি স্বাক্ষর এবং একটি পরামিতি ইস্যু বা কনভেনশন নামকরণের ইস্যু বা কোনও বৈশিষ্ট্য ইস্যু ইত্যাদির এইচআইটি করার চেষ্টা করার কারণে তারা সকলেই এটিকে ফুটিয়ে তুলেছে ...
টম স্টিকেল

4

আমি এই পার্টিতে দেরি করেছি তবে উপরোক্ত কিছুই কার্যকর ছিল না বা বেশিরভাগ ক্ষেত্রেই কাজ করছিল না, শেষ পর্যন্ত আমার জন্য কীভাবে এটি সমাধান করা হয়েছিল তা এখানে।

সার্ভারে সাইট / পরিষেবা হোস্ট করা ছিল, একটি বৈশিষ্ট্য প্রয়োজন! HTTP ক্রিয়াকলাপ !!!

সার্ভার ম্যানেজার> পরিচালনা> ভূমিকা এবং বৈশিষ্ট্যগুলি যোগ করুন> পরের পরের পর্যন্ত আপনি বৈশিষ্ট্যগুলি না পাওয়া পর্যন্ত>। নেট (প্রতিটি সংস্করণ) HTTP অ্যাক্টিভেশনটিকে টিক দিন। এছাড়াও নোট করুন> নেট> ডাব্লুসিএফ পরিষেবাদিগুলির নীচে একটি লুকানো রয়েছে।

এটি তখন তাত্ক্ষণিকভাবে কাজ! এটা আমার মস্তিষ্ক গলে ছিল


4

আপনার কাছে যদি কোনও রুট থাকে

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

পদ্ধতিতে আপনাকে ঠিক একই প্যারামিটারের নামটি ব্যবহার করতে হবে

public ReactorModel GetReactor(reactorId)
{
 ...
}

আপনি যদি একই একই পরামিতিটি পাস না করেন তবে আপনি ত্রুটিটি পেতে পারেন "405 পদ্ধতিটি অনুমোদিত নয়" কারণ রুটটি অনুরোধটির সাথে মেলে না এবং ওয়েবএপিআই বিভিন্ন অনুমোদিত HTTP পদ্ধতিতে একটি পৃথক নিয়ামক পদ্ধতিতে আঘাত করবে।


এটিও কোনও উত্তর নয়!
দিব্যাং দেশাই

@ ডিভ "405 পদ্ধতি অনুমোদিত নয়" আমি ভাগ করে নেওয়ার ক্ষেত্রে প্রদর্শিত হতে পারে কারণ রুট সেটআপটি অবৈধ হওয়ায় পদ্ধতিটি এপিআই-কল ধরবে না। এপিআই-কলটি অন্য একটি অযৌক্তিক পদ্ধতিতে আঘাত করতে পারে যার জন্য আলাদা HTTP ক্রিয়াকলাপ অনুমোদিত হতে পারে। হ্যাঁ আমি সম্মত হই যে এই উত্তরটি প্রকৃত প্রশ্নের জন্য ১০০% প্রাসঙ্গিক নাও হতে পারে, তবে জারদাসের প্রশ্নের শিরোনাম খুব নির্দিষ্ট নয় এবং আমি বিশ্বাস করি যে শিরোনাম অনুসারে বর্ণিত প্রশ্নের উত্তর অনুসন্ধানে অনেক লোক এখানে অবতরণ করতে পারে এই উত্তর দরকারী মনে।
রাইলাক


3

এটি আপনার নির্দিষ্ট প্রশ্নের উত্তর দেয় না, তবে আমার যখন একই সমস্যা হয়েছিল আমি এখানেই শেষ হয়ে গেলাম এবং আমি বুঝতে পেরেছিলাম যে আরও লোকেরাও এটি করতে পারে।

আমার যে সমস্যাটি ছিল তা হ'ল আমি নির্বিচারে আমার গেট পদ্ধতিটি স্থির হিসাবে ঘোষণা করেছিলাম । আমি এটি পুরো ফেনুনুন মিস করেছি এবং এটি বৈশিষ্ট্য বা অনুরূপ কোনও সতর্কবার্তা দেয় না।

ত্রুটিপূর্ণ:

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

সঠিক:

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

2

[এইচটিপিপিস্ট] অপ্রয়োজনীয়!

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

4
হ্যাঁ আপনি যেভাবে এটি করছেন তা সঠিক যে আপনার কোনও স্পষ্ট [এইচটিপিপোস্ট] দরকার নেই, তবে কিছু লোক আছেন যারা কনভেনশন (হ্যাঁ) অনুসরণ করছেন না এবং এইভাবে [রুট ("মাইমেথডসভার"]) পাবলিক স্ট্রিং মাইমথোডোসেভ (ইনট্রি)? আইডি) -> এটির জন্য একটি [এইচটিপিপोस्স্ট] প্রয়োজন হবে এবং এটি তখন কাজ করবে
টম স্টিকেল

2

আমি এটি সমাধান করতে পারে না। পোস্টটি শূন্য হয়ে যাওয়ার আগ পর্যন্ত আমি সিওআরএস সক্ষম এবং কাজ করেছিলাম (এএসপি.নেট ৪.০ - ওয়েবেপি ১)। আমি যখন কোনও HTTPResponseMessage ফেরত দেওয়ার চেষ্টা করেছি, আমি HTTP 405 প্রতিক্রিয়া পেতে শুরু করি।

উপরের ল্যাডের প্রতিক্রিয়ার ভিত্তিতে আমি আমার নিজস্ব উল্লেখগুলি একবার দেখেছি।

আমার পোস্ট সিস্টেমের উপরে আমার তালিকাভুক্ত [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>

এটি অপশন পূর্ব-উড়ানের অনুরোধে ডাকার পদ্ধতিতে থাকবে (পাশাপাশি পোষ্টেও), এমন সময়ে jsonসম্ভবত nullপ্রাক-উড়ানের অনুরোধগুলির সাধারণত প্যলড থাকে না, অথবা আপনি পোস্টের ক্রিয়াটি দু'বার চালাবেন।
গ্লেনসেল

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তাই আমরা এই API শেষবিন্দু অনুরোধ করা হয়েছিল, আইআইএস একটি ত্রুটি ফেরত পাঠাতে হয়েছে কারণ এটি লাগছিল হচ্ছে আমরা একটি ভার্চুয়াল যে ডিরেক্টরি আমরা দেওয়ার অনুমতি দেওয়া হয়নি অ্যাক্সেস করার চেষ্টা করছিলেন হবে।

বিকল্প 1: নিয়ন্ত্রকটি
বিকল্প 2 তে থাকা ডিরেক্টরিটি পরিবর্তন / পুনঃনামকরণ করুন : রুট প্রিফিক্সটি এমন কোনওটিতে পরিবর্তন করুন যা ভার্চুয়াল ডিরেক্টরিটির সাথে মেলে না।


1

আমার ক্ষেত্রে প্রকল্পটিতে আমার ওয়েবপিআই রুট (প্রাক্তন স্যান্ডবক্স) হিসাবে একই নামে একটি ফিজিকাল ফোল্ডার ছিল এবং আইওএসে স্পষ্টতই ফাইল হ্যান্ডলার দ্বারা স্পষ্টভাবেই কেবল POST অনুরোধটি বাধা দেওয়া হয়েছিল।

প্রত্যাশিত 404 এর পরিবর্তে একটি বিভ্রান্তিমূলক 405 ত্রুটি পাওয়া, এ কারণেই আমাকে সমস্যা সমাধানে দীর্ঘ সময় নিয়েছিল।

এতে পড়ে যাওয়া সহজ নয়, তবে সম্ভব। আশা করি এটি কাউকে সাহায্য করবে।


1

আমার অংশের জন্য আমার পোষ্ট হ্যান্ডলারটি এই ফর্মটির ছিল:

[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ক্লাস থেকে আপনার নিয়ামক উত্তরাধিকারসূত্রে নিশ্চিত হন ।

এমনকি এটি ক্রেজিওর হতে পারে যে জিনিসগুলি স্থানীয়ভাবে এমনকি এটি ছাড়াও কাজ করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.