ওয়েব এপিআই রাউটিং - এপিআই / {নিয়ামক} / {ক্রিয়া} / {আইডি} "কর্মহীনতা" এপিআই / {নিয়ামক} / {আইডি}


94

গ্লোবাল.এক্সএক্সে আমার ডিফল্ট রুট রয়েছে:

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

আমি একটি নির্দিষ্ট ক্রিয়াকে লক্ষ্য করতে সক্ষম হতে চেয়েছিলাম, তাই আমি অন্য একটি রুট তৈরি করেছি:

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

সুতরাং, আমার নিয়ামকটিতে আমার রয়েছে:

    public string Get(int id)
    {
        return "object of id id";
    }        

    [HttpGet]
    public IEnumerable<string> ByCategoryId(int id)
    {
        return new string[] { "byCategory1", "byCategory2" };
    }

কলিং .../api/records/bycategoryid/5আমার যা চাই তা দেবে। তবে কলিং .../api/records/1আমাকে ত্রুটি দেবে give

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

আমি বুঝলাম, কেন যে - যাত্রাপথ মাত্র সংজ্ঞায়িত কি URL গুলি বৈধ, কিন্তু আপনার এটি ফাংশন ম্যাচিং, উভয় আসে Get(int id)এবং ByCategoryId(int id)ম্যাচ api/{controller}/{id}, যা কি বিভ্রান্ত ফ্রেমওয়ার্ক।

ডিফল্ট এপিআই রুটটি আবার কাজ করার জন্য, এবং এটিতে রাখার জন্য আমাকে কী করতে হবে {action}? আমি RecordByCategoryIdControllerডিফল্ট এপিআই রুটের সাথে মিল রেখে নামকরণের জন্য আলাদা একটি নিয়ামক তৈরি করার কথা ভেবেছিলাম , যার জন্য আমি অনুরোধ করব .../api/recordbycategoryid/5। যাইহোক, আমি এটি একটি "নোংরা" (এইভাবে অসন্তুষ্টিজনক) সমাধান হতে পারি। আমি এর উত্তর খুঁজেছি এবং {action}এই সমস্যার উল্লেখ সহ কোনও রুট ব্যবহার করার জন্য কোনও টিউটোরিয়াল নেই ।

উত্তর:


105

রুট ইঞ্জিনটি আপনি এর মধ্যে বিধি যুক্ত করার সাথে একই ক্রম ব্যবহার করে। এটি প্রথম মিলের নিয়মটি পেয়ে গেলে এটি অন্যান্য নিয়মগুলি পরীক্ষা করা বন্ধ করে দেয় এবং নিয়ামক এবং ক্রিয়া অনুসন্ধান করতে এটি গ্রহণ করবে।

সুতরাং, আপনার উচিত:

  1. আপনার নির্দিষ্ট বিধিগুলি আপনার সাধারণ নিয়মের আগে রাখুন (ডিফল্টের মতো), যার অর্থ RouteTable.Routes.MapHttpRoute"উইথঅ্যাকশনএপি" প্রথমে মানচিত্রের ব্যবহার , তারপরে "ডিফল্টঅপি"।

  2. defaults: new { id = System.Web.Http.RouteParameter.Optional }আপনার "WithActionApi" নিয়মের প্যারামিটারটি সরান কারণ আইডি একবার alচ্ছিক হয়ে গেলে "/ api / {part1} / {part2}" এর মতো url কখনই "DefaultApi" এ যায় না।

  3. রুট ইঞ্জিনটি কোন পদক্ষেপে প্রবেশ করবে তা জানাতে আপনার "ডিফল্টঅপি" তে একটি নামযুক্ত ক্রিয়া যুক্ত করুন। অন্যথায় আপনার কন্ট্রোলারে একবারে আপনার একাধিক ক্রিয়া হয়ে গেলে ইঞ্জিনটি কোনটি ব্যবহার করবে তা জানতে পারবে না এবং "ছাঁটাইয়ের অনুরোধটি মিলেছে এমন একাধিক ক্রিয়া পাওয়া গেছে: ..."। তারপরে এটি আপনার পান পদ্ধতির সাথে মেলে, একটি অ্যাকশননামএট্রিবিউট ব্যবহার করুন ।

সুতরাং আপনার রুটটি এটি পছন্দ করে:

// Map this rule first
RouteTable.Routes.MapRoute(
     "WithActionApi",
     "api/{controller}/{action}/{id}"
 );

RouteTable.Routes.MapRoute(
    "DefaultApi",
    "api/{controller}/{id}",
    new { action="DefaultAction", id = System.Web.Http.RouteParameter.Optional }
);

এবং আপনার নিয়ামক:

[ActionName("DefaultAction")] //Map Action and you can name your method with any text
public string Get(int id)
{
    return "object of id id";
}        

[HttpGet]
public IEnumerable<string> ByCategoryId(int id)
{
    return new string[] { "byCategory1", "byCategory2" };
}

4
আমি উপরের পরামর্শটি চেষ্টা করেছিলাম এবং সবকিছু প্রত্যাশা অনুযায়ী কাজ করে। "গোপন" এর জন্য আপনাকে অনেক ধন্যবাদ।
মিকেল কারুসো

আপনার উত্তরের পয়েন্ট ২-এ, যদি idalচ্ছিক হয় তবে রাস্তার জন্য কোনও মিলের ক্রিয়া না পাওয়া গেলে URL এর মতো ইউআরএল /api/{part1}/{part2}এখনও DefaultApiপথে যেতে পারে WithActionApi। আমি ভুল হলে আমাকে সংশোধন করুন।
ওড়াদ

আমি কেবল এপিআই / {নিয়ামক} / {ক্রিয়া have রাখতে চাইলে কী হয়। আইডি ছাড়াই অন্য কেউ যদি একই সমস্যার মুখোমুখি হন। WebApiConfig সম্পর্কে ভুলে যাও অ্যাট্রিবিউট রাউটিং সম্পর্কে পড়ুন।
আহসান্ট

40

অ্যাট্রিবিউট রাউটিংয়ের সাহায্যে আপনি আপনার সমস্যা সমাধান করতে পারেন

নিয়ামক

[Route("api/category/{categoryId}")]
public IEnumerable<Order> GetCategoryId(int categoryId) { ... }

Jquery মধ্যে ইউআরআই

api/category/1

রুট কনফিগারেশন

using System.Web.Http;

namespace WebApplication
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API routes
            config.MapHttpAttributeRoutes();

            // Other Web API configuration not shown.
        }
    }
}

এবং আপনার ডিফল্ট রাউটিং ডিফল্ট কনভেনশন-ভিত্তিক রাউটিং হিসাবে কাজ করছে

নিয়ামক

public string Get(int id)
    {
        return "object of id id";
    }   

জ্যাকুরিতে ইউআরআই

/api/records/1 

রুট কনফিগারেশন

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Attribute routing.
        config.MapHttpAttributeRoutes();

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

আরও তথ্যের জন্য নিবন্ধটি পর্যালোচনা করুন এখানে এবং এটি অ্যাট্রিবিউট রাউটিং এবং অ্যানভেশন ভিত্তিক রাউটিং


godশ্বর উত্তর। তবে আমরা সবগুলি, এপিআই / {নিয়ামক} / {ক্রিয়া} / {আইডি ap পাশাপাশি এপিআই / {নিয়ামক} / {আইডি add যুক্ত করতে পারি না?
করিম

অ্যাট্রিবিউট রাউটিং অবশ্যই সমস্যা সমাধান করে। একটি গুরুত্বপূর্ণ বিষয়: ওয়েব এপিআই 2 এর আগে, ওয়েব এপিআই প্রকল্পের টেমপ্লেটগুলি এই জাতীয় কোড উত্পন্ন করে: সুরক্ষিত শূন্য অ্যাপ্লিকেশন_সার্ট () {ওয়েবএপিসিফিগ.আরজিস্টার (গ্লোবাল কনফিগারেশন.স কনফিগারেশন); Attrib যদি অ্যাট্রিবিউট রাউটিং সক্ষম করা থাকে তবে এই কোডটি একটি ব্যতিক্রম ছুঁড়ে দেবে। যদি আপনি অ্যাট্রিবিউট রাউটিং ব্যবহারের জন্য কোনও বিদ্যমান ওয়েব এপিআই প্রকল্প আপগ্রেড করেন তবে এই কনফিগারেশন কোডটি নিম্নলিখিতটিতে আপডেট করার বিষয়টি নিশ্চিত করুন: সুরক্ষিত শূন্য অ্যাপ্লিকেশন_সার্ট () {GlobalConfigration.Configure (WebApiConfig.Register); }
দেবি

0

এটা চেষ্টা কর.

public class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        var json = config.Formatters.JsonFormatter;
        json.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"));
        config.Formatters.Remove(config.Formatters.XmlFormatter);

        // Web API routes
        config.MapHttpAttributeRoutes();

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

        );
    }
}

0

সম্ভাব্য কারণ এটিও হতে পারে যে আপনি এপিআইকন্ট্রোলারের কাছ থেকে নিয়ামক উত্তরাধিকার সূত্রে পান নি। আমার সাথে ঘটেছিল একই বুঝতে কিছু সময় নিল।


0

রুটগুলিকে আলাদা করতে, আইডি সংখ্যার হতে হবে এমন একটি সীমাবদ্ধতা যুক্ত করার চেষ্টা করুন:

RouteTable.Routes.MapHttpRoute(
         name: "DefaultApi",
         routeTemplate: "api/{controller}/{id}",
         constraints: new { id = @"\d+" }, // Only matches if "id" is one or more digits.
         defaults: new { id = System.Web.Http.RouteParameter.Optional }
         );  
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.