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


167

ওয়েব এপিআইতে আমার অনুরূপ কাঠামোর একটি শ্রেণি ছিল:

public class SomeController : ApiController
{
    [WebGet(UriTemplate = "{itemSource}/Items")]
    public SomeValue GetItems(CustomParam parameter) { ... }

    [WebGet(UriTemplate = "{itemSource}/Items/{parent}")]
    public SomeValue GetChildItems(CustomParam parameter, SomeObject parent) { ... }
}

যেহেতু আমরা স্বতন্ত্র পদ্ধতিগুলির মানচিত্র করতে পারি, তাই সঠিক জায়গায় সঠিক অনুরোধটি পাওয়া খুব সহজ ছিল। অনুরূপ শ্রেণীর জন্য যার কেবলমাত্র একটি GETপদ্ধতি ছিল তবে Objectএটির একটি পরামিতি ছিল , আমি সফলভাবে ব্যবহার করেছি IActionValueBinder। তবে উপরে বর্ণিত ক্ষেত্রে আমি নিম্নলিখিত ত্রুটিটি পেয়েছি:

Multiple actions were found that match the request: 

SomeValue GetItems(CustomParam parameter) on type SomeType

SomeValue GetChildItems(CustomParam parameter, SomeObject parent) on type SomeType

আমি অগ্রাহ্য করে আপনি এই সমস্যার কাছে করার চেষ্টা করছি ExecuteAsyncপদ্ধতি ApiControllerএতদূর কিন্তু কোন ভাগ্য সঙ্গে। এই বিষয়ে কোন পরামর্শ?

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


1
আপনি এখনও রাউটপ্যারামিটার হিসাবে {পিতামাতার got পেয়েছেন? Alচ্ছিক?
অ্যান্টনি স্কট

হ্যা, আমি করেছিলাম. হতে পারে আমি IActionValueBinder কে ভুল উপায়ে ব্যবহার করছি কারণ int আইডি (ডেমো হিসাবে) এর মতো এটি ভাল কাজ করে।
পলিয়াস_ল

দুঃখিত, আমার আরও পরিষ্কার হওয়া উচিত ছিল। আমি ভেবেছিলাম যে এটি optionচ্ছিকভাবে থাকার অর্থ এটি আইটেম রুটের সাথে সাথে উপ-আইটেমের রুটের সাথে মিলে যায়, যা আপনি দেখছেন ত্রুটি বার্তাকে ব্যাখ্যা করবে।
অ্যান্টনি স্কট

আমাদের বর্তমানে বিবাদ রয়েছে, যদি নীচের পন্থাগুলি (একাধিক রুট সহ) যথাযথ আরএসটি বিধি বিপরীতে থাকে? আমার মতে এটি ঠিক আছে। আমার সহকর্মী মনে করেন এটি ভাল নয়। এ সম্পর্কে কোন মন্তব্য?
রেমি

REST সম্পর্কে পড়া শুরু করার সময় আমি সাধারণত এর বিপক্ষে ছিলাম। আমি এখনও নিশ্চিত নই যে এটি সঠিক পদ্ধতির কিনা তবে কখনও কখনও এটি আরও সুবিধাজনক বা ব্যবহারকারী-বান্ধব, তাই নিয়মগুলি সামান্য বাঁকানো এত খারাপ নাও হতে পারে। যতক্ষণ না এটি একটি নির্দিষ্ট সমস্যা সমাধানে কাজ করে। আমি এই প্রশ্নটি পোস্ট করার পরে ইতিমধ্যে 6 মাস কেটে গেছে এবং তখন থেকে আমাদের এই পদ্ধতির ব্যবহারের জন্য কোনও আক্ষেপ নেই।
পলিয়াস_ল

উত্তর:


249

অতিরিক্ত জিইটি পদ্ধতিগুলি সমর্থন করার জন্য এবং সাধারণ আরএসইটি পদ্ধতিগুলিকে সমর্থন করার জন্য এটি আমি সেরা পন্থা। আপনার 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 ক্রিয়াকলাপগুলি 'পান' দিয়ে শুরু না হলে আপনি পদ্ধতিতে একটি এইচটিপিগেট বৈশিষ্ট্য যুক্ত করতে চাইতে পারেন।


4
এটি একটি দুর্দান্ত উত্তর এবং এটি অন্য একটি সম্পর্কিত প্রশ্নের সাথে আমাকে অনেক সহায়তা করেছে। ধন্যবাদ !!
আলফেরো চিংগো

4
এটি চেষ্টা করে - কাজ করে না। রুটগুলি সমস্ত এলোমেলোভাবে getBlah (দীর্ঘ আইডি) পদ্ধতিতে ম্যাপ করা হয়। :(
BrainSlugs83

1
@ ব্রেনস্লাগস 83: এটি অর্ডের উপর নির্ভর করে। এবং আপনি ("আইডি" পদ্ধতিতে) যোগ করতে চাইবেন, এconstraints: new{id=@"\d+"}
এরিক ফলসকেন

4
কীভাবে আরও একটি পদ্ধতি যুক্ত করবেন - পাবেন (আইটি, স্ট্রিংয়ের নাম)? ... এটি ব্যর্থ হয়
অনিল পূর্সওয়ানি

1
routes.MapHttpRoute("DefaultApiPut", "Api/{controller}", new {action = "Put"}, new {httpMethod = new HttpMethodConstraint(HttpMethod.Put)});আমার Putপদ্ধতির জন্য আমাকে এই জাতীয় অতিরিক্ত রাস্তা যুক্ত করতে হয়েছিল অন্যথায় এটি আমাকে ৪০৪ দিচ্ছিল
সৈয়দ আলী তাকি

57

এটি থেকে যান:

config.Routes.MapHttpRoute("API Default", "api/{controller}/{id}",
            new { id = RouteParameter.Optional });

এটি:

config.Routes.MapHttpRoute("API Default", "api/{controller}/{action}/{id}",
            new { id = RouteParameter.Optional });

অতএব, আপনি এখন আপনার HTTP অনুরোধটি প্রেরণ করতে চান তা কোন পদক্ষেপ (পদ্ধতি) নির্দিষ্ট করতে পারেন।

থেকে পোস্টিং করে "http: // স্থানীয় হোস্ট: 8383 / API / কমান্ড / PostCreateUser" পূজা:

public bool PostCreateUser(CreateUserCommand command)
{
    //* ... *//
    return true;
}

এবং "http: // লোকালহোস্ট: 8383 / এপিআই / কমান্ড / পোস্টমেকবুকিং" - এ পোস্ট করা আহ্বান জানায়:

public bool PostMakeBooking(MakeBookingCommand command)
{
    //* ... *//
    return true;
}

আমি এটি একটি স্ব-হোস্ট করা ওয়েবে এপিআই পরিষেবা পরিষেবা অ্যাপ্লিকেশনটিতে চেষ্টা করেছি এবং এটি একটি কবজির মতো কাজ করে :)


8
সহায়ক উত্তরের জন্য ধন্যবাদ। আমি যুক্ত করতে চাই যে আপনি যদি আপনার পদ্ধতির নামগুলি get, Post ইত্যাদির সাহায্যে শুরু করেন তবে আপনার অনুরোধগুলি ব্যবহৃত HTTP ক্রিয়াটির উপর ভিত্তি করে সেই পদ্ধতিগুলিতে মানচিত্র তৈরি করবে। কিন্তু আপনি আপনার পদ্ধতি কিছু নাম দিতে পারেন, এবং তারপর তাদের সাথে সাজাইয়া রাখা [HttpGet], [HttpPost]ইত্যাদি পদ্ধতি ক্রিয়া ম্যাপ বৈশিষ্ট্যাবলী।
indot_brad

দয়া করে আমার প্রশ্নটি দেখুন
ময়েজ

@ ডিকাআরতা কারুনিয়া কোনও সমস্যা নেই, খুশী যে আমার উত্তরটি এখনও 6 বছর পরে প্রযোজ্য: ডি
উগহে

31

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

[RoutePrefix("api/example")]
public class ExampleController : ApiController
{
    [HttpGet]
    [Route("get1/{param1}")] //   /api/example/get1/1?param2=4
    public IHttpActionResult Get(int param1, int param2)
    {
        Object example = null;
        return Ok(example);
    }

}

আপনার ওয়েবপিকনফাইগ এও আপনার এটি দরকার

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

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

কিছু ভাল লিঙ্কগুলি http://www.asp.net/web-api/overview/getting-st সূত্র-with-aspnet-web-api/tutorial-your-first-web-api এই রাউটিংটির আরও ভাল ব্যাখ্যা করে। http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api


3
আমিও যোগ করার জন্য প্রয়োজন config.MapHttpAttributeRoutes();আমার কাছে WebApiConfig.cs, আর GlobalConfiguration.Configuration.EnsureInitialized();আমার শেষে WebApiApplication.Application_Start()পদ্ধতি কাজ রুট বৈশিষ্ট্যাবলী জন্য।
এরগওয়ান

@ এরগওয়ান এই মন্তব্যটি আমাকে অনেক সাহায্য করেছে। শুধু এটি যোগ করতে config.MapHttpAttributeRoutes();(রুট ম্যাপিং সামনে দরকার যেমন সামনে config.Routes.MappHttpRoute(...
ফিলিপ স্ট্রাটফোর্ড

11

গ্লোবাল.এক্সএক্স.সি. তে আপনাকে আরও রুটগুলি নির্ধারণ করতে হবে:

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

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

5
হ্যাঁ এটি সত্য তবে বাস্তবে routes রুটের উদাহরণ দেখে ভাল লাগবে। এটি এই উত্তরটিকে সম্প্রদায়ের কাছে আরও মূল্যবান করে তুলবে। (এবং আপনি আমার কাছ থেকে একটি +1 পেতে চাই :)
অরণ মুলহোল্যান্ড

আপনি এখানে একটি উদাহরণ পড়তে পারেন - stackoverflow.com/questions/11407267/…
টম

2
একটি প্রকৃত সমাধান ভাল হত।
অনেকগুলি গব্লিনস

6

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

প্যারামিটার পাস যদি GETপদ্ধতি অ্যাট্রিবিউট রাউটিং সিস্টেম ধরণ পার্থক্য জন্য বিভিন্ন যথেষ্ট সঙ্গে কেস হিসাবে ints এবং Guidআপনি প্রত্যাশিত টাইপ নির্দিষ্ট করতে পারেন র [Route...]বৈশিষ্ট্য

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

[RoutePrefix("api/values")]
public class ValuesController : ApiController
{

    // GET api/values/7
    [Route("{id:int}")]
    public string Get(int id)
    {
       return $"You entered an int - {id}";
    }

    // GET api/values/AAC1FB7B-978B-4C39-A90D-271A031BFE5D
    [Route("{id:Guid}")]
    public string Get(Guid id)
    {
       return $"You entered a GUID - {id}";
    }
} 

এই পদ্ধতির সম্পর্কে আরও তথ্যের জন্য, এখানে দেখুন

আরেকটি বিকল্প হল GETপদ্ধতিগুলি বিভিন্ন রুট দেওয়া give

    [RoutePrefix("api/values")]
    public class ValuesController : ApiController
    {
        public string Get()
        {
            return "simple get";
        }

        [Route("geta")]
        public string GetA()
        {
            return "A";
        }

        [Route("getb")]
        public string GetB()
        {
            return "B";
        }
   }

আরও বিশদ জানতে এখানে দেখুন - http://nodogmablog.bryanhogan.net/2016/10/web-api-2-controller-with-m Multipleple - get - methods/


5

এএসপি.নেট কোর 2.0 তে আপনি নিয়ামকটিতে রুট বৈশিষ্ট্য যুক্ত করতে পারেন :

[Route("api/[controller]/[action]")]
public class SomeController : Controller
{
    public SomeValue GetItems(CustomParam parameter) { ... }

    public SomeValue GetChildItems(CustomParam parameter, SomeObject parent) { ... }
}

4

আমি একাধিক গেট মেথডের অনুমতি দেওয়ার জন্য ওয়েব অপি 2 অ্যাট্রিবিউট রাউটিংটি ব্যবহার করার চেষ্টা করছিলাম এবং আমি পূর্ববর্তী উত্তরগুলি থেকে সহায়ক পরামর্শগুলি সংযুক্ত করেছিলাম, তবে কন্ট্রোলারে আমি কেবল "বিশেষ" পদ্ধতিটি সজ্জিত করেছি (উদাহরণস্বরূপ):

[Route( "special/{id}" )]
public IHttpActionResult GetSomethingSpecial( string id ) {

... এছাড়াও কন্ট্রোলারের শীর্ষে একটি [রুটপ্রিফিক্স] না রেখে:

[RoutePrefix("api/values")]
public class ValuesController : ApiController

জমা দেওয়া ইউআরআইয়ের সাথে মিলে কোনও রুট পাওয়া যায়নি বলে আমি ত্রুটি পাচ্ছিলাম। একবার আমি সম্পূর্ণভাবে কন্ট্রোলারকে সজ্জিত করার পাশাপাশি [রুট] পদ্ধতিটি সজ্জিত করার পাশাপাশি [রুটপ্রিফিক্স] উভয়ই পেয়েছি it


3

আপনি উত্তরটি পেয়েছেন কিনা তা সম্পর্কে আমি নিশ্চিত নই, তবে আমি এটি করেছি এবং এটি কার্যকর

public IEnumerable<string> Get()
{
    return new string[] { "value1", "value2" };
}

// GET /api/values/5
public string Get(int id)
{
    return "value";
}

// GET /api/values/5
[HttpGet]
public string GetByFamily()
{
    return "Family value";
}

এখন Global.asx এ

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

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

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

3

আপনি কি ওয়েবআইভোকএট্রিবিউটে স্যুইচ করার এবং পদ্ধতিটি "জিইটি" এ সেট করার চেষ্টা করেছেন?

আমি বিশ্বাস করি যে আমারও একই সমস্যা ছিল এবং আমার পদ্ধতিগুলির ক্ষেত্রে সবচেয়ে বেশি কী পদ্ধতি (GET / PUT / POST / DELETE) সবচেয়ে বেশি প্রত্যাশিত তা স্পষ্টভাবে বলতে শুরু করেছিলাম।

public class SomeController : ApiController
{
    [WebInvoke(UriTemplate = "{itemSource}/Items"), Method="GET"]
    public SomeValue GetItems(CustomParam parameter) { ... }

    [WebInvoke(UriTemplate = "{itemSource}/Items/{parent}", Method = "GET")]
    public SomeValue GetChildItems(CustomParam parameter, SomeObject parent) { ... }
}

WebGet উচিত এটি পরিচালনা কিন্তু আমি দেখা করেছি একাধিক কিছু সমস্যা একই রিটার্ন টাইপ অনেক কম একাধিক পেতে আছে।

[সম্পাদনা করুন: ডাব্লুসিএফ ওয়েবএপিআইয়ের সূর্যাস্ত এবং এমভিসি স্ট্যাকের এএসপি. নেট ওয়েবএপিআইতে স্থানান্তর সহ এগুলির কোনওটিই বৈধ নয়]


1
আমি দুঃখিত, আমি উল্লেখ করতে ভুলে গেছি যে আমি ডাব্লুসিএফ ওয়েব এপিআই বন্ধ না করার পরে কোডটি এএসপি.এনইটি ওয়েব এপিআইতে স্থানান্তরিত করছি। আমি পোস্টটি সম্পাদনা করেছি। ধন্যবাদ.
পলিয়াস_ল

2
**Add Route function to direct the routine what you want**
    public class SomeController : ApiController
    {
        [HttpGet()]
        [Route("GetItems")]
        public SomeValue GetItems(CustomParam parameter) { ... }

        [HttpGet()]
        [Route("GetChildItems")]
        public SomeValue GetChildItems(CustomParam parameter, SomeObject parent) { ... }
    }

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

1
ব্যক্তিগতভাবে (এসও সুপারিশগুলি কী তা আমি জানি) একটি প্রশ্নের জন্য এই পরিষ্কার / বেসিক আমার ব্যক্তিগতভাবে অনেকটা খাঁটি কোডের উত্তর থাকবে। আমি কার্যকর ব্যাবহারিক সফ্টওয়্যারটি দ্রুত তৈরি করতে চাই এমন প্রচুর ব্যাখ্যা পড়তে চাই না । +1
মেমিডিভোপার

2

অলস / তাড়াতাড়ি বিকল্প (ডটনেট কোর ২.২):

[HttpGet("method1-{item}")]
public string Method1(var item) { 
return "hello" + item;}

[HttpGet("method2-{item}")]
public string Method2(var item) { 
return "world" + item;}

তাদের কল করা:

স্থানীয় হোস্ট: 5000 / API / controllername / method1-42

"Hello42"

স্থানীয় হোস্ট: 5000 / API / controllername / method2-99

"World99"


0

উপরের উদাহরণগুলির মধ্যে আমার ব্যক্তিগত প্রয়োজনের জন্য কোনও কাজ করেনি। নীচে আমি কি শেষ করেছিলাম।

 public class ContainsConstraint : IHttpRouteConstraint
{       
    public string[] array { get; set; }
    public bool match { get; set; }

    /// <summary>
    /// Check if param contains any of values listed in array.
    /// </summary>
    /// <param name="param">The param to test.</param>
    /// <param name="array">The items to compare against.</param>
    /// <param name="match">Whether we are matching or NOT matching.</param>
    public ContainsConstraint(string[] array, bool match)
    {

        this.array = array;
        this.match = match;
    }

    public bool Match(System.Net.Http.HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values, HttpRouteDirection routeDirection)
    {
        if (values == null) // shouldn't ever hit this.                   
            return true;

        if (!values.ContainsKey(parameterName)) // make sure the parameter is there.
            return true;

        if (string.IsNullOrEmpty(values[parameterName].ToString())) // if the param key is empty in this case "action" add the method so it doesn't hit other methods like "GetStatus"
            values[parameterName] = request.Method.ToString();

        bool contains = array.Contains(values[parameterName]); // this is an extension but all we are doing here is check if string array contains value you can create exten like this or use LINQ or whatever u like.

        if (contains == match) // checking if we want it to match or we don't want it to match
            return true;
        return false;             

    }

আপনার রুট ব্যবহারের উপরেরটি ব্যবহার করতে:

config.Routes.MapHttpRoute("Default", "{controller}/{action}/{id}", new { action = RouteParameter.Optional, id = RouteParameter.Optional}, new { action = new ContainsConstraint( new string[] { "GET", "PUT", "DELETE", "POST" }, true) });

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

config.Routes.MapHttpRoute("GetStatus", "{controller}/status/{status}", new { action = "GetStatus" });

উপরের দিকে এটি মূলত নিম্নলিখিত URL => http://www.domain.com/Account/Status/Activeবা এর মতো কিছু সন্ধান করছে।

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


new System.Web.Http.Routing.HttpMethodConstraint(HttpMethod.Get, HttpMethod.Post, HttpMethod.Put, HttpMethod.Delete) পরিবর্তে আপনি ব্যবহার করতে পারেন ।
আবাটিশচেভ

0

উপরের কোনও রাউটিং সলিউশন কাজ করতে পারেনি - সিনট্যাক্সের কিছু কিছু পরিবর্তিত হয়েছে বলে মনে হয় এবং আমি এখনও এমভিসির কাছে নতুন - যদিও আমি এই সত্যই ভয়ঙ্কর (এবং সহজ) হ্যাকটি একসাথে রেখেছি যা আমাকে পেয়ে যাবে আপাতত - নোট করুন, এটি "সার্বজনীন মাইবজেক্ট গেটমাইবজেক্টস (দীর্ঘ আইডি)" পদ্ধতিটি প্রতিস্থাপন করে - আমরা "আইডি" এর ধরণটিকে একটি স্ট্রিংয়ে পরিবর্তন করি এবং রিটার্নের ধরণটিকে বস্তুতে পরিবর্তন করি।

// GET api/MyObjects/5
// GET api/MyObjects/function
public object GetMyObjects(string id)
{
    id = (id ?? "").Trim();

    // Check to see if "id" is equal to a "command" we support
    // and return alternate data.

    if (string.Equals(id, "count", StringComparison.OrdinalIgnoreCase))
    {
        return db.MyObjects.LongCount();
    }

    // We now return you back to your regularly scheduled
    // web service handler (more or less)

    var myObject = db.MyObjects.Find(long.Parse(id));
    if (myObject == null)
    {
        throw new HttpResponseException
        (
            Request.CreateResponse(HttpStatusCode.NotFound)
        );
    }

    return myObject;
}

0

যদি আপনার একই ফাইলে একাধিক অ্যাকশন থাকে তবে একই যুক্তি যেমন সমস্ত ক্রিয়ায় আইডি পাস করুন। এটি কারণ ক্রিয়া কেবল আইডি সনাক্ত করতে পারে, সুতরাং যুক্তির কোনও নাম দেওয়ার পরিবর্তে কেবল এই জাতীয় আইডিকেই ঘোষণা করে।


[httpget]
[ActionName("firstAction")] firstAction(string Id)
{.....
.....
}
[httpget]
[ActionName("secondAction")] secondAction(Int Id)
{.....
.....
}
//Now go to webroute.config file under App-start folder and add following
routes.MapHttpRoute(
name: "firstAction",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);

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

ব্রাউজারে প্রতিটি ফাংশন দেখতে ইউরাল দেখতে কেমন হবে?
Si8

0

সরল বিকল্প

শুধু একটি কোয়েরি স্ট্রিং ব্যবহার করুন।

রাউটিং

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

নিয়ামক

public class TestController : ApiController
{
    public IEnumerable<SomeViewModel> Get()
    {
    }

    public SomeViewModel GetById(int objectId)
    {
    }
}

অনুরোধ

GET /Test
GET /Test?objectId=1

বিঃদ্রঃ

মনে রাখবেন যে ক্যোয়ারিং স্ট্রিং প্যারামটি "আইডি" বা কনফিগার করা রুটে পরামিতি যা কিছু নয় whatever


-1

WebApiConfig সংশোধন করুন এবং শেষে অন্য একটি রুট যুক্ত করুন ap

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

তারপরে এটির মতো একটি নিয়ামক তৈরি করুন:

public class ServiceController : ApiController
{
        [HttpGet]
        public string Get(int id)
        {
            return "object of id id";
        }
        [HttpGet]
        public IQueryable<DropDownModel> DropDowEmpresa()
        {
            return db.Empresa.Where(x => x.Activo == true).Select(y =>
                  new DropDownModel
                  {
                      Id = y.Id,
                      Value = y.Nombre,
                  });
        }

        [HttpGet]
        public IQueryable<DropDownModel> DropDowTipoContacto()
        {
            return db.TipoContacto.Select(y =>
                  new DropDownModel
                  {
                      Id = y.Id,
                      Value = y.Nombre,
                  });
        }

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

এভাবেই সমাধান করেছি। আমি আশা করি এটি কাউকে সাহায্য করবে।

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