একাধিক ক্রিয়া পাওয়া গেছে যা ওয়েব এপিতে অনুরোধটির সাথে মেলে


243

আমি যখন 2 "পান" পদ্ধতিতে চেষ্টা করি তখন আমি এই ত্রুটিটি পেতে থাকি

একাধিক ক্রিয়া পাওয়া গেছে যা অনুরোধটির সাথে মেলে: ওয়েবপিপি

আমি স্ট্যাকের বিষয়ে এ সম্পর্কিত অন্যান্য অনুরূপ প্রশ্নগুলির চারদিকে তাকিয়ে ছিলাম তবে আমি এটি পাই না।

আমার 2 টি আলাদা নাম আছে এবং "এইচটিপিপিট" বৈশিষ্ট্যটি ব্যবহার করে

[HttpGet]
public HttpResponseMessage Summary(MyVm vm)
{
    return null;
}

[HttpGet]
public HttpResponseMessage FullDetails()
{
    return null;
}

উত্তর:


485

আপনার রুটের মানচিত্র সম্ভবত এরকম কিছু:

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

তবে একই HTTP পদ্ধতিতে একাধিক ক্রিয়াকলাপ করার জন্য আপনাকে ওয়েবপাপিকে এই জাতীয় রুটের মাধ্যমে আরও তথ্য সরবরাহ করতে হবে:

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

লক্ষ্য করুন যে রুটটিম্পলেটটিতে এখন একটি ক্রিয়া রয়েছে। এখানে আরও প্রচুর তথ্য: http://www.asp.net/web-api/overview/web-api-routing-and-tives/routing-in-aspnet-web-api

হালনাগাদ:

ঠিক আছে, এখন যেহেতু আমি মনে করি আপনি বুঝতে পেরেছেন যে আপনি এখানে আছেন তার পরে আর একটি বিষয় হ'ল:

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

উদাহরণস্বরূপ আপনার দুটি পদ্ধতি রূপান্তরিত হতে পারে:

public HttpResponseMessage Get()
{
    return null;
}

public HttpResponseMessage Get(MyVm vm)
{
    return null;
}

আপনি কী ধরণের ডেটা মাইভিএম অবজেক্টে পাস করছেন? আপনি যদি কেবল ইউআরআই এর মাধ্যমে ভেরিয়েবলগুলি পাস করতে সক্ষম হন তবে আমি সেই পথে যাওয়ার পরামর্শ দিই। অন্যথায়, আপনাকে অনুরোধের শুরুর দিকে অবজেক্টটি প্রেরণ করতে হবে এবং একটি জিইটি করার সময় এটি আপনার খুব HTTP নয় (এটি যদিও কাজ করে, কেবল [মাইভিএম] ইনফ্রন্টবিডি] ব্যবহার করুন)।

আশা করি এটি চিত্রিত করে যে আপনার অ্যাকশন নাম বা এমনকি [এইচটিপিপিট] বৈশিষ্ট্যটি ব্যবহার না করেই একক নিয়ামককে একাধিক জিইটি পদ্ধতি থাকতে পারে।


এক উপায়ে বা অন্যভাবে করার কোনও সুবিধা আছে কি? আমি যদি মাধ্যমিকটি করি তবে আমি কি প্রতিটি পদ্ধতির জন্য কেবল এইচটিটিপি অ্যাকশন রেখেছি? এটাই কি বড় ড্র?
chobo2

3
একজনের অপরটির পক্ষে কোনও সুবিধা রয়েছে কিনা তা আপনার প্রকল্পের উপর নির্ভর করে। আপনি যদি বিশ্রামের এপিআই তৈরি করে থাকেন তবে আপনি HTTP কনভেনশনগুলি (GET, POST, PUT, DELETE ...) ব্যবহার করতে চাইবেন। এক্ষেত্রে রাউটিং কোডের প্রথম ব্লকটি হ'ল উপায় তবে আপনি এপিআইয়ের মাধ্যমে প্রকাশিত প্রতিটি সত্তার জন্য আলাদা কন্ট্রোলার চাইবেন। আপনার পদ্ধতির নামগুলির ভিত্তিতে, আমি অনুমান করছি যে এটি তেমন নয় তাই আরও বর্ণনামূলক রাউটিংটি ব্যবহার করুন। যখন আপনার রুটে ক্রিয়াটি অন্তর্ভুক্ত থাকে আপনি প্রতিটি পদ্ধতিতে স্পষ্টতই http বৈশিষ্ট্যটি রাখতে চান।
জেদ

1
@ chobo2 নিয়ন্ত্রকের মধ্যে কেবল সেই পদ্ধতিগুলিই নামকরণ করা হবে না কেন? গেটসুমারী (মাইভিএম ডাব্লুএম) এবং গেটডেটেলস ()
জেড

1
আপনার উত্তরের জন্য ধন্যবাদ, শুধু আমার দুটি ক্রিয়াকলাপের আলাদা আলাদা নাম থাকা সত্ত্বেও কেন রুট রেজোলিউশন কাজ করছে না তা সন্ধান করতে আমাকে সহায়তা করেছিল। আমি কেন কেবল ডিফল্ট আচরণ নয় (যেমন ওয়েবপিকনফিগ.সি.সি.এল ইনক্লুড "{ক্রিয়াকলাপ default" এ ডিফল্ট রুট টেম্পলেটটি দেয় না) তা নিয়ে আমি সত্যিই বিভ্রান্ত!
তেজাস শর্মা

1
@bruno এলাকায় ব্যবহার করেন তাহলে আপনি 'অ্যাডমিন' নির্দিষ্ট API গুলি ভালো যোগ করতে পারেন AdminAreaRegistration মধ্যে stackoverflow.com/a/9849011/16940
Simon_Weaver

67

ওয়েব এপিআই 2 হিসাবে আপডেট।

আপনার WebApiConfig.cs ফাইলগুলিতে এই API কনফিগারেশন সহ:

public static void Register(HttpConfiguration config)
{
    //// Web API routes
    config.MapHttpAttributeRoutes(); //Don't miss this

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

আপনি আমাদের নিয়ামককে এভাবে চালিত করতে পারেন:

[Route("api/ControllerName/Summary")]
[HttpGet]
public HttpResponseMessage Summary(MyVm vm)
{
    rturn null;
}

[Route("api/ControllerName/FullDetails")]
[HttpGet]
public HttpResponseMessage FullDetails()
{
    return null;
}

যেখানে কন্ট্রোলারনাম আপনার নিয়ামকের নাম ("নিয়ামকবিহীন")। এটি আপনাকে উপরে বর্ণিত রুটটির সাথে প্রতিটি ক্রিয়া পেতে দেয়।

আরও পড়ার জন্য: http://www.asp.net/web-api/overview/web-api-routing- and-tives/ attribute- routing-in-web- api-2


আমি এই সমাধানটি সত্যিই পছন্দ করেছি। আমার ডিফল্ট রুটটি এখনও একই এবং ব্যতিক্রমগুলির জন্য আমার একটি "ব্যতিক্রম" রুট রয়েছে
লিয়ানড্রো ডি মেলো ফাগুন্দেস

আপনি ইউআরএল EX তে পরামিতিগুলিও ম্যাপ করতে পারেন: [রুট ("এপিআই / কন্ট্রোলারনাম / সংক্ষিপ্ত বিবরণ / {
ভিএম

15

ওয়েব এপিআইতে (ডিফল্টরূপে) পদ্ধতিগুলি HTTP পদ্ধতি এবং রুটের মানগুলির সংমিশ্রণের ভিত্তিতে চয়ন করা হয় ।

MyVmকোনও জটিল অবজেক্টের মতো দেখায়, শরীর থেকে ফর্ম্যাটারে পড়ে আপনার কাছে রুটের ডেটার দিক থেকে দুটি অভিন্ন পদ্ধতি রয়েছে (যেহেতু এগুলির কোনওটিরই রুট থেকে কোনও প্যারামিটার নেই) - যা প্রেরককে (যথাযথটির IHttpActionSelectorসাথে মেলে) অসম্ভব করে তোলে makes ।

অস্পষ্টতা সমাধানের জন্য আপনার কাছে কোয়েস্ট্রিস্টিং বা রুট প্যারামিটার দ্বারা পৃথক হওয়া দরকার।


14

অনেকগুলি ওয়েব অনুসন্ধান করার পরে এবং যদি নীচের সন্ধান পেয়ে থাকে তবে মানচিত্রের রাউটিংয়ের জন্য সবচেয়ে উপযুক্ত ফর্মটি সন্ধান করার চেষ্টা করছেন

config.Routes.MapHttpRoute("DefaultApiWithId", "Api/{controller}/{id}", new { id =RouteParameter.Optional }, new { id = @"\d+" });
config.Routes.MapHttpRoute("DefaultApiWithAction", "Api/{controller}/{action}");

এই ম্যাপিংটি অ্যাকশন নেম ম্যাপিং এবং বেসিক http কনভেনশন উভয়ের জন্য আবেদন করে (জিইটি, পোস্ট, পুট, ডিলেট)


9
আমার জন্য এটি কাজ করেছে, তবে কেবল রুট কনফিগারেশনের রুটের ক্রম পরিবর্তন করার পরে যাতে ক্রিয়াকলাপের সাথে সবার আগে উপস্থিত হয়
ফ্রেড্রিক স্টল্প

ঠিক এখানে অর্ডার গুরুত্বপূর্ণ

5

আপনার ওয়েবমেডথগুলি একই ইউআরএল থেকে সমাধান করা সম্ভব হতে পারে। নীচের লিঙ্কটি একবার দেখুন: -

http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

সুতরাং, আপনার রাউটিং টেবিলটিতে আপনার পদ্ধতিটির নাম যুক্ত করতে পারে।


5

ক্রিয়া ব্যবহার না করে বিকল্পগুলি হ'ল:

  1. পদ্ধতিগুলির মধ্যে একটিকে অন্য একটি নিয়ামককে সরান, যাতে সেগুলির সংঘাত না ঘটে।

  2. পরম লাগে এমন একটি পদ্ধতি ব্যবহার করুন এবং যদি তা আপনার কোড থেকে অন্য পদ্ধতিতে কল করে।


এটি সমাধান হতে পারে, তবে সর্বোত্তম নয়, যাইহোক আমার পক্ষ থেকে +1 :)
সতীশ কুমার ভি

4

এই সমাধানটি আমার পক্ষে কাজ করেছিল।

WebApiConfig- এ প্রথমে রুট 2 রাখুন। এছাড়াও প্রতিটি পদ্ধতির আগে এইচটিপিপেট এবং এইচটিটিপিপোস্ট যুক্ত করুন এবং ইউআরএলটিতে নিয়ামকের নাম এবং পদ্ধতির নাম অন্তর্ভুক্ত করুন।

WebApiConfig =>

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

নিয়ামক =>

public class ValuesController : ApiController
{

    [HttpPost]
    public string GetCustomer([FromBody] RequestModel req)
    {
        return "Customer";
    }

    [HttpPost]
    public string GetCustomerList([FromBody] RequestModel req)
    {
        return "Customer List";
    }
}

ইউরাল =>

http://localhost:7050/api/Values/GetCustomer

http://localhost:7050/api/Values/GetCustomerList

4

এটি প্রত্যেকের জন্য উত্তর যারা জানেন যে সমস্ত কিছু সঠিক এবং 50 বার পরীক্ষা করেছেন .....

আপনি বারবার না তাকিয়ে আছেন তা নিশ্চিত করুন RouteConfig.cs

আপনি যে ফাইলটি সম্পাদনা করতে চান তার নাম দেওয়া হয়েছে WebApiConfig.cs

এছাড়াও, এটি সম্ভবত ঠিক এর মতো দেখা উচিত:

using System.Web.Http;

namespace My.Epic.Website
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
          config.MapHttpAttributeRoutes();

          // api/Country/WithStates
          config.Routes.MapHttpRoute(
            name: "ControllerAndActionOnly",
            routeTemplate: "api/{controller}/{action}",
            defaults: new { },
            constraints: new { action = @"^[a-zA-Z]+([\s][a-zA-Z]+)*$" });

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

আমি নিজেকে প্রায় 3 ঘন্টা বাঁচাতে পারতাম।


1
ধন্যবাদ, আপনি আমাকে প্রায় 3 ঘন্টা বাঁচিয়েছেন
geedubb

3

আমি দেখতে পেলাম যে যখন আমার দুটি পান পদ্ধতি আছে, একটি প্যারামিটারলেস এবং একটি জটিল পরামিতি হিসাবে প্যারামিটার হিসাবে আমার একই ত্রুটি ঘটে got আইডি নামের প্রথম ধরণের পরামিতি হিসাবে আমার জটিল টাইপ পরামিতি অনুসরণ করে আমি টাইপ ইন্টের একটি ডামি প্যারামিটার যুক্ত করে এটি সমাধান করেছি। আমি তখন রুট টেম্পলেটে জটিল ধরণের পরামিতি যুক্ত করেছি। নিম্নলিখিত আমার জন্য কাজ করে।

প্রথম পেতে:

public IEnumerable<SearchItem> Get()
{
...
}

দ্বিতীয় পেতে:

public IEnumerable<SearchItem> Get(int id, [FromUri] List<string> layers)
{
...
}

WebApiConfig:

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

3

ওয়েব এপিআই নিয়ন্ত্রকের পরিবর্তে এমভিসি নিয়ামক ব্যবহারের কারণে এটি সম্ভব। ওয়েব এপিআই কন্ট্রোলারে নেমস্পেসটি চেক করুন এটি নীচের মতো হওয়া উচিত

using System.Net;
using System.Net.Http;
using System.Web.Http;

যদি নেমস্পেসটি নীচের মত হয় তবে এটি ওয়েব এপিআই নিয়ন্ত্রণকারী পদ্ধতি কলিংয়ের উপরের ত্রুটিটি দেওয়া হবে

using System.Web;
using System.Web.Mvc;

2

দয়া করে আপনার দুটি পদ্ধতি রয়েছে যা আলাদা নাম এবং একই পরামিতি রয়েছে তা পরীক্ষা করে দেখুন।

যদি তা হয় তবে দয়া করে কোনও পদ্ধতি মুছুন এবং চেষ্টা করুন।


2

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

ধরে নিও তোমার আছে

public IEnumerable<string> Get()
{
    return this.Repository.GetAll();
}

[HttpGet]
public void ReSeed()
{
    // Your custom action here
}

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

আমি আমার অতিরিক্ত ক্রিয়াকলাপগুলিতে "ডামি" পরামিতিগুলি যুক্ত করতে চাইনি তাই আমি ডিফল্ট ক্রিয়ায় সন্ধান করলাম এবং সাথে এলাম:

[ActionName("builtin")]
public IEnumerable<string> Get()
{
    return this.Repository.GetAll();
}

"দ্বৈত" রুট বাঁধনের সাথে একত্রে প্রথম পদ্ধতির জন্য:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { action = "builtin", id = RouteParameter.Optional },
    constraints: new { id = @"\d+" });

config.Routes.MapHttpRoute(
    name: "CustomActionApi",
    routeTemplate: "api/{controller}/{action}");

মনে রাখবেন যে প্রথম রুটের টেম্পলেটে কোনও "অ্যাকশন" প্যারামিটার না থাকলেও আপনি সম্ভবত এখনও একটি "ডিফল্ট ক্রিয়া" কনফিগার করতে পারেন যাতে আমাদের "সাধারণ" ওয়েবএপিআই কলগুলির রাউটিং এবং অতিরিক্ত ক্রিয়াকলাপের কলকে আলাদা করতে দেয়।


2

আমার ক্ষেত্রে সবকিছু ঠিক ছিল

1) ওয়েব কনফিগারেশন সঠিকভাবে কনফিগার করা হয়েছিল 2) রুট প্রিফিক্স এবং রুটের বৈশিষ্ট্যগুলি যথাযথ ছিল

তবুও আমি ত্রুটি পেয়ে যাচ্ছিলাম। আমার ক্ষেত্রে "রুট" বৈশিষ্ট্যটি (এফ 12 টিপে চাপিয়ে) System.Web.MVc তে নির্দেশিত ছিল কিন্তু System.Web.Http এর কারণে সমস্যাটি সৃষ্টি হয়েছিল।


এই উত্তরটি আমাকে অনেক সাহায্য করেছে!
tvb108108

1

আপনি [Route("api/[controller]/[action]")]আপনার নিয়ামক শ্রেণিতে যোগ করতে পারেন ।

[Route("api/[controller]/[action]")]
[ApiController]
public class MySuperController : ControllerBase
{
 ...
}

0

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে কখনও কখনও যখন আপনি ওয়েবএপিআইয়ের সাথে সংযোগ স্থাপনের জন্য অ্যাঙ্গুলারজেএস-এর মতো পরিষেবা সংস্থান ব্যবহার করেন, তখন আপনি নিশ্চিত হন যে আপনি সঠিক রুটটি ব্যবহার করছেন, অন্যথায় এই ত্রুটি ঘটবে।


0

নিশ্চিত হয়ে নিন যে আপনি ডিফল্ট GET | PUT | POST | ডিটিএলটি [এইচটিপিপিস্ট / পুট / গেট / ডিলিট] বৈশিষ্ট্য সহ অ্যাকশন মুছে ফেলুন Control আমি আমার ভ্যানিলা পোস্ট নিয়ন্ত্রক ক্রিয়াকলাপে এই অ্যাটটিবুটটি যুক্ত করেছি এবং এটি 404 এর কারণ হয়েছে।

আশা করি এটি কাউকে সহায়তা করবে কারণ এটি খুব হতাশাব্যঞ্জক হতে পারে এবং অগ্রগতি থামতে পারে।


0

উদাহরণস্বরূপ => টেস্টকন্ট্রোলার

        [HttpGet]
        public string TestMethod(int arg0)
        {
            return "";
        }

        [HttpGet]
        public string TestMethod2(string arg0)
        {
            return "";
        }

        [HttpGet]
        public string TestMethod3(int arg0,string arg1)
        {
            return "";
        }

আপনি যদি কেবল ওয়েবএপিপিফিন.সি.সি ফাইল পরিবর্তন করতে পারেন।

 config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}/",
                defaults: null
            );

এটাই :)

এবং ফলাফল: এখানে চিত্র বর্ণনা লিখুন


0

আপনি কি চেষ্টা করেছেন:

[HttpGet("Summary")]
public HttpResponseMessage Summary(MyVm vm)
{
    return null;
}

[HttpGet("FullDetails")]
public HttpResponseMessage FullDetails()
{
    return null;
}

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