এএসপি.নেট ওয়েব অপি: অনুরোধ করা সংস্থানটি http পদ্ধতি 'জিইটি' সমর্থন করে না


95

আমি একটি এপি কন্ট্রোলারের উপর নিম্নলিখিত ক্রিয়া পেয়েছি:

public string Something()
{
    return "value";
}

এবং আমি আমার রুটগুলি নিম্নরূপে কনফিগার করেছি:

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

বিটাতে, এটি ঠিক কাজ করেছে, তবে আমি সম্প্রতি প্রকাশিত প্রার্থীর সাথে আপডেট করেছি এবং এখন আমি এই জাতীয় কলগুলিতে ত্রুটি দেখতে পাচ্ছি:

অনুরোধ করা সংস্থানটি http পদ্ধতি 'জিইটি' সমর্থন করে না।

কেন এই কাজ আর হয় না?

(আমি মনে করি যে আমি "ক্রিয়া" থেকে মুক্তি পেয়ে কেবল এক টন নিয়ামক তৈরি করতে পারি, তবে এটি অগোছালো মনে হয়))

উত্তর:


110

আপনি যদি কন্ট্রোলারে আপনার ক্রিয়াকলাপের জন্য কোনও এইচটিপিএমথোদ কনফিগার না করে থাকেন তবে এটি আরসিতে কেবল এইচটিপিপিস্ট হিসাবে ধরে নেওয়া হবে। বিটাতে, এটি সমস্ত পদ্ধতি - GET, PUT, POST এবং মুছুন সমর্থন করে। এটি বিটা থেকে আরসিতে একটি ছোট্ট পরিবর্তন। আপনি [অ্যাকসেপ্টভাইবার্স ("জিইটি", "পোস্ট")] এর সাথে আপনার ক্রিয়াকলাপে সহজেই একাধিক পোস্টমেডোর সজ্জা করতে পারেন।


ঠিক এই সমস্যার মুখোমুখি হয়েছি, ঠিক করার জন্য ধন্যবাদ, তবে কৌতূহল, কেন আমি আমার কাস্টম পদ্ধতিগুলি সহ এটি করতে হবে, কিন্তু ডিফল্ট "get" পদ্ধতিটি নয়? আমার কাছে একটি গেট পদ্ধতি আছে যা নিয়ামকের জন্য টেমপ্লেট দ্বারা তৈরি করা হয়েছিল, তবে এটি সজ্জিত নয়। নামটি পেয়েছেন বলেই কি এটি কনভেনশন করে?
সেলআরমডটনেট

4
@ জোশ: হ্যাঁ! অ্যাকশন পদ্ধতির নাম যখন "get ..." দিয়ে শুরু হয় তখন আপনাকে এটিকে জিইটি পদ্ধতি হিসাবে চিহ্নিত করতে হবে না। এখানে আরও পড়ুন: asp.net/web-api/overview/web-api-routing- and
বল্লা

আমি উত্তরে প্রস্তাবিত হিসাবে করেছি তবে এখন আমার উভয় কল, গেট এবং পোস্ট, গেট অ্যাকশনে পুনঃনির্দেশিত হচ্ছে। কোন সাহায্য দয়া করে?
সৈয়দ আলী তাকী

55

উপরের সমস্ত তথ্য সঠিক, আমি এগুলিও উল্লেখ করতে চাই যে [AcceptVerbs()]টেক্সটটি সিস্টেম.ওয়েব.এমভিসি এবং সিস্টেম.ওয়েব.এইচটিপি নেমস্পেসে উভয়তেই বিদ্যমান।

আপনি সিস্টেম.ওয়েব.এইচটিটিপি ব্যবহার করতে চান যদি এটি কোনও ওয়েব এপিআই নিয়ন্ত্রক থাকে।


@ এরিক আশ্চর্যজনক, এ কারণেই এটি আমার পক্ষে কাজ করে না। আমার ক্রিয়াটিতে আমার ক্রিয়াটি ছিল তবে এটি ওয়েব.এমভিসি এর মাধ্যমে রেফারেন্স করা হয়েছিল তাই কাজ করছে না।
ড্রিজা

দুর্দান্ত, আপনি আমার দিনটি বাঁচিয়েছেন
হোসেইন নারিমণি র‌্যাড

আপনাকে অনেক ধন্যবাদ, কারণ System.Web.Mvc আমার পক্ষে ভাল ছিল না।
বুড়াক করাকুş

34

যদিও এটি ওপির কোনও উত্তর নয়, আমার সম্পূর্ণ ভিন্ন মূল কারণ থেকে ঠিক একই ত্রুটি ছিল; সুতরাং যদি এটি অন্য কাউকে সাহায্য করে ...

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

[HttpGet]
public Programme GetProgrammeById(int id)
{
    ...
}

[HttpDelete]
public bool DeleteProgramme(int programmeId)
{
    ...
}

মুছে ফেলার অনুরোধগুলি ... / এপিআই / প্রোগ্রামগুলি / 3 মুছে ফেলা হয়েছে যেমনটি আমি প্রত্যাশা করে মুছে ফেললাম না, তবে গেটপোগ্রামমে বিআইআইডি তে, কারণ ডিলিটপ্রগ্রামে আইডির একটি প্যারামিটার নাম ছিল না। গেটপ্রগ্রামমেবিআইডি তখন অবশ্যই ডিলিটকে প্রত্যাখ্যান করেছিল কারণ এটি কেবল জিইটিএস গ্রহণযোগ্য হিসাবে চিহ্নিত।

সুতরাং ফিক্সটি সহজ ছিল:

[HttpDelete]
public bool DeleteProgramme(int id)
{
    ...
}

এবং সব ঠিক আছে। বোকা ভুল সত্যিই কিন্তু ডিবাগ করা শক্ত।


4
যদি কেউ url রাউটিং ব্যবহার করে থাকেন তবে [রুট ("(programmeId = programmeId: int}")] এর মতো করে চেষ্টা করুন
শ্রী

4
এটা আমার জন্য ছিল। WebApiConfig -> MapHttpRoutes -> রুট টেম্পলেট ছিল: "এপিআই / {নিয়ামক} / {আইডি}", সুতরাং 'আইডি' এর একটি প্যারামিটার ব্যবহার করতে হয়েছিল।
হকিজে

4
আপনার উত্তরটি আমাকে আমার সমস্যার দিকে ইঙ্গিত করেছিল যা কিছুটা আলাদা ছিল আমি পদ্ধতির জন্য একটি [ফ্যুরিউড়ি] প্যারামিটারের নাম পরিবর্তন করেছি এবং ক্লায়েন্টের পক্ষে এটি আপডেট করি নি
Matus

22

আপনি যদি আপনার পদ্ধতিটি দিয়ে সজ্জিত করছেন তবে নিয়ামকের শীর্ষে HttpGetনিম্নলিখিতটি যুক্ত করুন using:

using System.Web.Http;

আপনি যদি ব্যবহার করে থাকেন System.Web.Mvcতবে এই সমস্যা দেখা দিতে পারে।


4
এটি সত্য এবং হাস্যকরভাবে। নেট স্পষ্টভাবে বার্তা দেখাচ্ছে না।
তেওমান শিপাহি

15

এটি অবশ্যই বিটা থেকে আরসিতে পরিবর্তন। প্রশ্নে প্রদত্ত উদাহরণে, আপনাকে এখন [ক্রিয়াকলাপ] [HttpGet] বা [AcceptVerbs ("GET")] দিয়ে আপনার ক্রিয়াটি সাজাতে হবে।

যদি আপনি ক্রিয়াভিত্তিক অ্যাকশনগুলির সাথে ক্রিয়াভিত্তিক ক্রিয়াগুলি (যেমন "গেটসোমিংথিং", "পোস্টসামিং") মিশ্রণ করতে চান তবে এটি একটি সমস্যার সৃষ্টি করে। আপনি যদি উপরে বর্ণিত বৈশিষ্ট্যগুলি ব্যবহার করার চেষ্টা করেন তবে এটি আপনার নিয়ামকের কোনও ক্রিয়া ভিত্তিক ক্রিয়াকলাপের সাথে বিরোধের সৃষ্টি করবে। উত্সাহিত হওয়ার একটি উপায় যা প্রতিটি ক্রিয়াটির জন্য পৃথক রুট সংজ্ঞা দেওয়া এবং ক্রিয়াটির নামে ডিফল্ট ক্রিয়া সেট করা। আপনার এপিআইতে শিশু সংস্থান সংজ্ঞা দেওয়ার জন্য এই পদ্ধতির ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, নিম্নলিখিত কোডটি সমর্থন করে: "/ রিসোর্স / আইডি / শিশু" যেখানে আইডি এবং শিশুরা optionচ্ছিক।

        context.Routes.MapHttpRoute(
           name: "Api_Get",
           routeTemplate: "{controller}/{id}/{action}",
           defaults: new { id = RouteParameter.Optional, action = "Get" },
           constraints: new { httpMethod = new HttpMethodConstraint("GET") }
        );

        context.Routes.MapHttpRoute(
           name: "Api_Post",
           routeTemplate: "{controller}/{id}/{action}",
           defaults: new { id = RouteParameter.Optional, action = "Post" },
           constraints: new { httpMethod = new HttpMethodConstraint("POST") }
        );

আশা করি ভবিষ্যতের ওয়েব API- র সংস্করণগুলিতে এই দৃশ্যের জন্য আরও ভাল সমর্থন থাকবে। এস্পনেটব্লস্ট্যাক কোডপ্লেক্স প্রকল্পে বর্তমানে একটি সমস্যা রয়েছে, http://aspnetwebstack.codeplex.com/workitem/184 । যদি আপনি এমন কিছু দেখতে চান তবে দয়া করে ইস্যুটিতে ভোট দিন।


8

ওপির মতোই সেটআপ করুন। অনেক ক্রিয়া সহ একটি নিয়ামক ... কম "অগোছালো" :-)

আমার ক্ষেত্রে আমি একটি নতুন ক্রিয়া যুক্ত করার সময় "[এইচটিপিপিট]" ভুলে গেছি।

[HttpGet]
public IEnumerable<string> TestApiCall()
{
    return new string[] { "aa", "bb" };
}

6

উপরের মতো একই সমস্যা, তবে সম্পূর্ণ আলাদা। আমার জন্য, এটি ছিল যে আমি একটি https পুনর্লিখনের নিয়মের সাথে একটি শেষ পয়েন্টটি হিট করছি। HTTP এ এটি আঘাত করার ফলে ত্রুটির সৃষ্টি হয়েছিল, https- র সাথে প্রত্যাশা অনুযায়ী কাজ করেছে।


3

এই পথে নিম্নলিখিত কোডটি প্রতিস্থাপন করুন

পথ:

App_Start => WebApiConfig.cs

কোড:

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

1

এটি অপের পোস্টের সাথে সম্পর্কিত হতে পারে কিনা তা আমি জানি না তবে আমি [এইচটিপিপিট] টীকাটি অনুপস্থিত ছিল এবং এটিই ত্রুটি সৃষ্টি করছিল, যেমনটি @ দিনেশ_রাভা পদ্ধতি অনুসারে ডিফল্টরূপে এইচটিটিপোস্ট বলে ধরে নেওয়া হয়।


0

আমার ইস্যুটি নাল রেফারেন্স থাকার মতোই সহজ ছিল যা প্রত্যাবর্তিত বার্তায় প্রদর্শিত হয়নি, এটি দেখতে আমার API টি ডিবাগ করতে হয়েছিল।


0

এসএসএল ছাড়াই কোনও ক্যোয়ারী চালানোর সময় আমি এই ত্রুটিটি পেয়েছি।

আমার অনুরোধের এইচটিটিপি থেকে এইচটিটিপিএস-তে কেবল ইউআরএল স্কিম পরিবর্তন করা এটি ঠিক করে দিয়েছে।


@ সিজারিও আমি একমত নই - এটি প্রশ্নের উত্তর দেওয়ার চেষ্টা বলে মনে হচ্ছে। আমি এটিতে "ঠিক আছে" ভোট দিচ্ছি।
ইজোশুয়াস - মনিকা

@ ইজুশুয়াএস-রিইনস্টেটমোনিকা এটি একটি মন্তব্যের মতো আরও প্রদর্শিত হবে যা প্রশ্নের সত্যিকারের উত্তর নয়। সমস্যার নীচে স্বীকৃত উত্তর এবং অন্যান্য উত্তরের উপর ভিত্তি করে স্কিমার সাথে সম্পর্কিত বলে মনে হচ্ছে না।
সিজারিও

@ সিজারিও ভুল উত্তরগুলি খুব কম মানের নয় - আপনি যদি মনে করেন যে উত্তরটি ভুল, তবে আপনার ডাউন করা উচিত। দয়া করে দেখুন: নিস্পষ্টভাবে ভুল উত্তরগুলি কি খুব নিম্ন মানের?
ইজোশুয়াস - মনিকা

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