ASP.NET ওয়েব API এ কাস্টম পদ্ধতির নাম


110

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

public class UsersController : BaseApiController
{
    public string GetAll()
    {
        return "getall!";
    }

    public string Get(int id)
    {
        return "get 1! " + id;
    }

    public User GetAuthenticate(string userName, string password, string applicationName)
    {
        LogWriter.Write(String.Format("Received authenticate request for username {0} and password {1} and application {2}",
            userName, password, applicationName));

        //check if valid leapfrog login.
        var decodedUsername = userName.Replace("%40", "@");
        var encodedPassword = password.Length > 0 ? Utility.HashString(password) : String.Empty;
        var leapFrogUsers = LeapFrogUserData.FindAll(decodedUsername, encodedPassword);

        if (leapFrogUsers.Count > 0)
        {
            return new User
            {
                Id = (uint)leapFrogUsers[0].Id,
                Guid = leapFrogUsers[0].Guid
            };
        }
        else
            throw new HttpResponseException("Invalid login credentials");
    }
}

আমি মায়াপি / এপিআই / ব্যবহারকারী / ব্রাউজ করতে পারি এবং এটি গেটআল কল করবে এবং আমি মায়াপি / এপিআই / ব্যবহারকারী / 1 তে ব্রাউজ করতে পারি এবং এটি গেইট কল করবে, তবে আমি মায়াপি / এপি / ব্যবহারকারী / প্রমাণীকরণ? ইউজার নেম = {0} & পাসওয়ার্ড = {1} তারপরে এটি get (প্রমাণীকৃত নয়) এবং ত্রুটি কল করবে:

পরামিতি অভিধানে 'Navtrak.Services.WCF.NavtrakAPI.Controllers.UversController' এর পদ্ধতি 'System.String গেট (Int32)' এর জন্য নন-অযোগ্য প্রকারের 'System.Int32' এর প্যারামিটার 'আইডি' এর জন্য একটি নাল এন্ট্রি রয়েছে। একটি alচ্ছিক প্যারামিটার অবশ্যই একটি রেফারেন্স টাইপ, একটি nallable টাইপ, বা alচ্ছিক পরামিতি হিসাবে ঘোষিত হতে হবে।

আমি কীভাবে কাস্টম পদ্ধতির নামগুলি যেমন প্রমাণীকরণকে কল করতে পারি?


দয়া করে এই লিঙ্কটি উল্লেখ করুন: 5 তম উত্তর stackoverflow.com/questions/12775590/…
বিশ্ব জি

উত্তর:


136

ডিফল্টরূপে রুট কনফিগারেশনটি RESTFul কনভেনশন অনুসরণ করে যার অর্থ এটি কেবল গেট, পোস্ট, পুট এবং মুছে ফেলা কর্ম গ্রহণ করবে (গ্লোবাল.াস্যাক্স => এ রুটটি ডিফল্টরূপে দেখায়) এটি আপনাকে কোনও ক্রিয়াকলাপের নাম উল্লেখ করতে দেয় না => এটি প্রেরণের জন্য HTTP ক্রিয়া ব্যবহার করে)। সুতরাং আপনি যখন কোনও জিইটি অনুরোধ প্রেরণ করবেন তখন /api/users/authenticateমূলত Get(int id)অ্যাকশনটি কল করে এবং পাস করছেনid=authenticate স্পষ্টতই ক্র্যাশ হয়ে কারণ আপনার গেট অ্যাকশনটি পূর্ণসংখ্যার প্রত্যাশা করে।

যদি আপনি মানকগুলির চেয়ে আলাদা ক্রিয়াকলাপের নাম রাখতে চান তবে আপনি নিজের রুট সংজ্ঞাটি এখানে পরিবর্তন করতে পারবেন global.asax:

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

এখন আপনি /api/values/getauthenticateব্যবহারকারীকে প্রমাণীকরণ করতে নেভিগেট করতে পারেন ।


20
এখনও অন্য ক্রিয়াকলাপের অনুমতি দেওয়ার পরে get (id), get () পুট, মুছুন, পোস্ট ব্যবহার করার কোনও উপায় আছে কি?
শান ম্লেয়ান

@ শ্যাশনমেক্যালান আমি অনুমান করি যে আপনি {action}এটির কোনও বাধা না থাকলে অন্য কোনও রুট নির্দিষ্ট করতে পারেন {id}যাতে intবা Guid(বা যা কিছু) ব্যতীত অন্য কোনও কিছু মেলে না। তারপরে এটি ডারিন
স্টিভ গ্রেট্রেক্স

2
এখানে আরও একটি গুরুত্বপূর্ণ বিষয় হ'ল এই স্টাইলের রাউটিংয়ের সাথে আপনাকে অনুমোদিত HTTP পদ্ধতিগুলি নির্দিষ্ট করার জন্য বৈশিষ্ট্যগুলি অবশ্যই ব্যবহার করতে হবে (যেমন [এইচটিপিপিট])।
হিমালয় গার্গ

1
আপনি কি নিশ্চিত যে আপনার অন্যান্য ক্রিয়াগুলি ব্যবহার করা উচিত? আপনি কি REST সম্মেলনের মধ্যে যা করছেন তা কি সত্যিই ফিট করার চেষ্টা করেছেন? অন্যান্য ক্রিয়াগুলি ব্যবহার করার প্রয়োজন হবে না।
নিকো

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

88

এটিই এখন পর্যন্ত সেরা জিইটি পদ্ধতিগুলিকে অন্তর্ভুক্ত করার জন্য আমি এখনও সেরা উত্সাহ নিয়ে এসেছি, পাশাপাশি সাধারণ আরএসইটি পদ্ধতিগুলিকে সমর্থন করি। আপনার WebApiConfig এ নিম্নলিখিত রুটগুলি যুক্ত করুন:

routes.MapHttpRoute("DefaultApiWithId", "Api/{controller}/{id}", new { id = RouteParameter.Optional }, new { id = @"\d+" });
routes.MapHttpRoute("DefaultApiWithAction", "Api/{controller}/{action}");
routes.MapHttpRoute("DefaultApiGet", "Api/{controller}", new { action = "Get" }, new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) });
routes.MapHttpRoute("DefaultApiPost", "Api/{controller}", new {action = "Post"}, new {httpMethod = new HttpMethodConstraint(HttpMethod.Post)});

আমি নীচের পরীক্ষা ক্লাসের সাথে এই সমাধানটি যাচাই করেছি। আমি নীচে আমার নিয়ামকটিতে প্রতিটি পদ্ধতি সফলভাবে হিট করতে সক্ষম হয়েছি:

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

    public string Get(int id)
    {
        return string.Empty;
    }

    public string GetAll()
    {
        return string.Empty;
    }

    public void Post([FromBody]string value)
    {
    }

    public void Put(int id, [FromBody]string value)
    {
    }

    public void Delete(int id)
    {
    }
}

আমি যাচাই করেছি যে এটি নিম্নলিখিত অনুরোধগুলি সমর্থন করে:

GET /Test
GET /Test/1
GET /Test/GetAll
POST /Test
PUT /Test/1
DELETE /Test/1

দ্রষ্টব্য যে আপনার অতিরিক্ত GET ক্রিয়াকলাপগুলি 'পান' দিয়ে শুরু না হলে আপনি পদ্ধতিতে একটি এইচটিপিগেট বৈশিষ্ট্য যুক্ত করতে চাইতে পারেন।


1
সুন্দর সমাধান, আপনি কি আমাকে বলতে পারবেন যে আমি কীভাবে putএবং deleteক্রিয়াগুলি যেমন আপনি করেছেন তেমন কনফিগার করেছি getএবং post, খুব ভাল কাজ করবে?
ফিলিপ ওরিয়ানি

1
আমার মতে এটি ওয়েবএপিআই প্রকল্পগুলির ডিফল্টগুলিতে অন্তর্ভুক্ত করা উচিত (সম্ভবত মন্তব্য করা হয়েছে)। এটি আপনাকে একই সময়ে ওয়েবপিআই এবং এমভিসি স্টাইলের রুট দেয় ...
জন কালভিনার

1
@ ফিলিপ ওরিয়ানি, আমি মনে করি না যে আপনি এই অপারেশনটি প্রয়োগ করতে চান সেই সংস্থানটি সনাক্ত করতে এই অনুরোধগুলি সাধারণত কোনও আইডি প্যারামিটার সহ যেহেতু আপনাকে অনুরোধ করতে putবা কনফিগার করতে হবে বা deleteক্রিয়াগুলি করতে হবে বলে আমি মনে করি না । একটি deleteকলকে /api/fooএকটি ত্রুটি ছুঁড়ে দেওয়া উচিত কারণ আপনি কোন ফু মুছতে চাইছেন? সুতরাং DefaultApiWithId রুটে এই মামলাগুলি জরিমানা করা উচিত।
nwayve

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

প্রথমটির জন্য, DefaultApiWithId, নতুন {id = রুটপ্যারামিটারের পরিবর্তে ডিফল্টগুলি শূন্য হওয়া উচিত নয়? Ptionচ্ছিক}? 'আইডি' লাগবে না?
জনি ওশিকা

22

আমি এমভিসি 4 বিশ্বের মধ্যে দিন days

এর মূল্য কী, তার জন্য আমার কাছে একটি সাইটসাইপিকন্ট্রোলার রয়েছে এবং আমার একটি কাস্টম পদ্ধতি দরকার ছিল, যার নাম বলা যেতে পারে:

http://localhost:9000/api/SitesAPI/Disposition/0

বিভিন্ন স্বভাবের সাথে রেকর্ড পেতে সর্বশেষ প্যারামিটারের জন্য বিভিন্ন মান।

পরিশেষে আমার জন্য যা কাজ করেছে তা হ'ল:

সাইটসপিক নিয়ন্ত্রণকারী পদ্ধতি:

// GET api/SitesAPI/Disposition/1
[ActionName("Disposition")]
[HttpGet]
public Site Disposition(int disposition)
{
    Site site = db.Sites.Where(s => s.Disposition == disposition).First();
    return site;
}

এবং এটি WebApiConfig.cs এ

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

// this i added
config.Routes.MapHttpRoute(
    name: "Action",
    routeTemplate: "api/{controller}/{action}/{disposition}"
 );

যতক্ষণ না আমি {আইডি {হিসাবে {স্বভাবের নাম রেখেছিলাম {

{
"Message": "No HTTP resource was found that matches the request URI 'http://localhost:9000/api/SitesAPI/Disposition/0'.",
"MessageDetail": "No action was found on the controller 'SitesAPI' that matches the request."
}

আমি যখন it স্বভাবের it নাম দিয়েছি তখন এটি কাজ করা শুরু করে। সুতরাং স্পষ্টতই পরামিতিটির নামটি স্থানধারকটির সাথে মানটির সাথে মিলছে।

এই উত্তরটি আরও নির্ভুল / ব্যাখ্যামূলক করে তুলতে নির্দ্বিধায় দ্বিধা করুন।


বখশিশের জন্য ধন্যবাদ. আমি তোমার মত একই ভুল করছিলাম।
অভি

16

ডিফল্টরূপে ওয়েব অপি এপিআই / {নিয়ামক} / {আইডি of আকারে URL টি প্রত্যাশা করে, এই ডিফল্ট রাউটিংটিকে ওভাররাইড করতে। আপনি নীচের দুটি উপায়ে যেকোনটির সাথে রাউটিং সেট করতে পারেন।

প্রথম বিকল্প:

WebApiConfig.cs এ নীচে রুট রেজিস্ট্রেশন যুক্ত করুন

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

নীচের মত করে HTTPGet এবং পরামিতিগুলি দিয়ে আপনার ক্রিয়া পদ্ধতিটি সাজান

[HttpGet]
public HttpResponseMessage ReadMyData(string param1,
                        string param2, string param3)

 {

// your code here

}

উপরের পদ্ধতির কল করার জন্য ইউআরএল নীচের মত হবে

HTTP: // স্থানীয় হোস্ট: [yourport] / API / MyData / ReadMyData PARAM1 = মান 1 & PARAM2 = VALUE2 & param3 = value3

দ্বিতীয় বিকল্পটি নিয়ন্ত্রক শ্রেণিতে রুট প্রিফিক্স যুক্ত করুন এবং নীচের মত করে HTTPGet সহ আপনার ক্রিয়া পদ্ধতিটি সাজান। এই ক্ষেত্রে কোনও WebApiConfig.cs পরিবর্তন করার প্রয়োজন নেই। এটিতে ডিফল্ট রাউটিং থাকতে পারে।

[RoutePrefix("api/{controller}/{action}")]
public class MyDataController : ApiController
{

[HttpGet]
public HttpResponseMessage ReadMyData(string param1,
                        string param2, string param3)

{

// your code here

}

}

উপরের পদ্ধতির কল করার জন্য ইউআরএল নীচের মত হবে

HTTP: // স্থানীয় হোস্ট: [yourport] / API / MyData / ReadMyData PARAM1 = মান 1 & PARAM2 = VALUE2 & param3 = value3


আমি দ্বিতীয় বিকল্পটি খুব পছন্দ করি। আপনি কীভাবে এটি ভিবিএনটিতে ব্যবহার করবেন তা আমাকে দেখাতে পারেন? অনেক ধন্যবাদ.
ব্যবহারকারী 1617676

12

আপনি যদি এএসপি.নেট এমভিসি 6 এর সাথে এএসপি নেট নেট 5 ব্যবহার করছেন তবে এই উত্তরগুলির বেশিরভাগটি কার্যকর হবে না কারণ আপনি সাধারণত এমভিসিটিকে আপনার জন্য উপযুক্ত রুট সংগ্রহ তৈরি করতে দেবেন (ডিফল্ট আরএসটিফুল কনভেনশনগুলি ব্যবহার করে), যার অর্থ আপনি কোন পাবেন নাRoutes.MapRoute() সম্পাদনা করার কল ।

ConfigureServices()পদ্ধতি দ্বারা প্রার্থনা Startup.csফাইল নির্ভরতা ইনজেকশন ASP.NET 5 পাতাটা ফ্রেমওয়ার্ক সঙ্গে MVC রেজিস্টার করো হবে: যে ভাবে, যখন আপনি কল ApplicationBuilder.UseMvc()যে ক্লাসে পরে, MVC ফ্রেমওয়ার্ক স্বয়ংক্রিয়ভাবে আপনার অ্যাপ্লিকেশানে এই ডিফল্ট রুট যোগ করা হবে। UseMvc()কাঠামো উত্স কোডের মধ্যে পদ্ধতি প্রয়োগের দিকে তাকিয়ে আমরা হুডের পিছনে কী ঘটে তা একবার দেখে নিতে পারি :

public static IApplicationBuilder UseMvc(
    [NotNull] this IApplicationBuilder app,
    [NotNull] Action<IRouteBuilder> configureRoutes)
{
    // Verify if AddMvc was done before calling UseMvc
    // We use the MvcMarkerService to make sure if all the services were added.
    MvcServicesHelper.ThrowIfMvcNotRegistered(app.ApplicationServices);

    var routes = new RouteBuilder
    {
        DefaultHandler = new MvcRouteHandler(),
        ServiceProvider = app.ApplicationServices
    };

    configureRoutes(routes);

    // Adding the attribute route comes after running the user-code because
    // we want to respect any changes to the DefaultHandler.
    routes.Routes.Insert(0, AttributeRouting.CreateAttributeMegaRoute(
        routes.DefaultHandler,
        app.ApplicationServices));

    return app.UseRouter(routes.Build());
}

এ সম্পর্কে ভাল বিষয় হ'ল ফ্রেমওয়ার্কটি এখন সমস্ত কঠোর পরিশ্রম পরিচালনা করে, সমস্ত কন্ট্রোলারের ক্রিয়াকলাপগুলির মাধ্যমে পুনরাবৃত্তি করে এবং তাদের ডিফল্ট রুটগুলি সেট করে দেয়, ফলে আপনাকে কিছু অপ্রয়োজনীয় কাজ বাঁচায়।

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

কনভেনশন ভিত্তিক

আপনার স্টার্টআপ। সি ক্লাসে, এটি প্রতিস্থাপন করুন:

app.UseMvc();

এর সাথে:

app.UseMvc(routes =>
            {
                // Route Sample A
                routes.MapRoute(
                    name: "RouteSampleA",
                    template: "MyOwnGet",
                    defaults: new { controller = "Items", action = "Get" }
                );
                // Route Sample B
                routes.MapRoute(
                    name: "RouteSampleB",
                    template: "MyOwnPost",
                    defaults: new { controller = "Items", action = "Post" }
                );
            });

অ্যাট্রিবিউট ভিত্তিক

এমভিসি 6 সম্পর্কে একটি দুর্দান্ত বিষয় হ'ল আপনি Controllerক্লাস এবং / অথবা Actionযথাযথ RouteAttributeএবং / অথবা HttpGet/ HttpPostটেমপ্লেট প্যারামিটারগুলি, যেমন নীচের মতো করে সজ্জিত করে প্রতি-নিয়ামক ভিত্তিতে রুটগুলিও সংজ্ঞায়িত করতে পারেন :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNet.Mvc;

namespace MyNamespace.Controllers
{
    [Route("api/[controller]")]
    public class ItemsController : Controller
    {
        // GET: api/items
        [HttpGet()]
        public IEnumerable<string> Get()
        {
            return GetLatestItems();
        }

        // GET: api/items/5
        [HttpGet("{num}")]
        public IEnumerable<string> Get(int num)
        {
            return GetLatestItems(5);
        }       

        // GET: api/items/GetLatestItems
        [HttpGet("GetLatestItems")]
        public IEnumerable<string> GetLatestItems()
        {
            return GetLatestItems(5);
        }

        // GET api/items/GetLatestItems/5
        [HttpGet("GetLatestItems/{num}")]
        public IEnumerable<string> GetLatestItems(int num)
        {
            return new string[] { "test", "test2" };
        }

        // POST: /api/items/PostSomething
        [HttpPost("PostSomething")]
        public IActionResult Post([FromBody]string someData)
        {
            return Content("OK, got it!");
        }
    }
}

এই নিয়ামক নিম্নলিখিত অনুরোধগুলি পরিচালনা করবেন:

 [GET] api/items
 [GET] api/items/5
 [GET] api/items/GetLatestItems
 [GET] api/items/GetLatestItems/5
 [POST] api/items/PostSomething

এছাড়াও লক্ষ করুন যে আপনি যদি দুটি পদ্ধতির টগিটার ব্যবহার করেন তবে অ্যাট্রিবিউট-ভিত্তিক রুটগুলি (যখন সংজ্ঞায়িত হয়) কনভেনশন-ভিত্তিকগুলি ওভাররাইড করে এবং উভয়ই সংজ্ঞায়িত ডিফল্ট রুটগুলিকে ওভাররাইড করে UseMvc()

আরও তথ্যের জন্য, আপনি আমার ব্লগে নিম্নলিখিত পোস্টটি পড়তে পারেন ।


1
এটি নিখুঁত! অন্য উত্তরগুলির মধ্যে আসলে আমার যা প্রয়োজন তা করা হয়নি। তবে আপনি আমাকে বাঁচিয়েছেন :)
কিং আর্থার তৃতীয়

দ্বিতীয় পরামিতি হিসাবে পূর্বনির্ধারিত মডেলটি ব্যবহার করার কোনও উপায় আছে কি? উদাহরণস্বরূপ, যখন আমি ভালো একটি নির্দিষ্ট ব্যবহারকারী প্যাচিং করছি: public IActionResult Patch(int id, [FromQuery] Person person), সব ইনকামিং বৈশিষ্ট্য নাল হয়!
কিং আর্থার তৃতীয়

9

নামযুক্ত ক্রিয়াকলাপগুলির দীর্ঘ আলোচনার জন্য এই নিবন্ধটি দেখুন। এটি আরও দেখায় যে আপনি "get" দিয়ে ক্রিয়া নামটি উপস্থাপনের পরিবর্তে [এইচটিপিপিট] বৈশিষ্ট্যটি ব্যবহার করতে পারেন।

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


0

কেবল আপনার WebAPIConfig.cs বেলো হিসাবে পরিবর্তন করুন

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

তারপরে আপনার এপিআই বেলো হিসাবে প্রয়োগ করুন

    // GET: api/Controller_Name/Show/1
    [ActionName("Show")]
    [HttpGet]
    public EventPlanner Id(int id){}

0

ওয়েব এপিআই 2 এবং পরবর্তী সংস্করণগুলি নতুন ধরণের রাউটিংকে সমর্থন করে, যাকে অ্যাট্রিবিউট রাউটিং বলে। নামটি থেকে বোঝা যায়, অ্যাট্রিবিউট রাউটিং রুটগুলি সংজ্ঞায়িত করতে অ্যাট্রিবিউট ব্যবহার করে। অ্যাট্রিবিউট রাউটিং আপনাকে আপনার ওয়েব এপিআইতে ইউআরআইয়ের উপর আরও নিয়ন্ত্রণ দেয়। উদাহরণস্বরূপ, আপনি সহজেই ইউআরআই তৈরি করতে পারেন যা সংস্থানগুলির শ্রেণিবদ্ধতা বর্ণনা করে।

উদাহরণ স্বরূপ:

[Route("customers/{customerId}/orders")]
public IEnumerable<Order> GetOrdersByCustomer(int customerId) { ... }

নিখুঁত হবে এবং WebApiConfig.cs উদাহরণস্বরূপ আপনার কোনও অতিরিক্ত কোডের দরকার নেই। কেবলমাত্র আপনাকে অবশ্যই নিশ্চিত হতে হবে যে ওয়েব এপিআই রাউটিং ওয়েবএপিপিফিগ.সি.এস-এ সক্ষম হয়েছে কি না, যদি না আপনি নীচের মত সক্রিয় করতে পারেন:

        // Web API routes
        config.MapHttpAttributeRoutes();

আপনাকে ওয়েবএপিপিফিগ.সি.এস এ আরও কিছু করতে বা কিছু পরিবর্তন করতে হবে না। আরও তথ্যের জন্য আপনি এই নিবন্ধটি একবার দেখতে পারেন ।

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