Answered by:
Few basic issue about ASP.Net Web Api Routing and Action method

Question
-
User264732274 posted
i am new in web api. just reading article on it to get hold of this technology. i have good reputation in this site but apologized that i am going to post few basic question on web api routing and action method.
i was reading a write up from this url http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2
1) what is the meaning of this kind of url
/customers/1/orders
2) how this kind of url
/customers/1/orders
is mapped to action. if possible how action method look like with attribute?
[Route("customers/{customerId}/orders")] public IEnumerable<Order> GetOrdersByCustomer(int customerId) { ... }
3) first see a sample code for routing
public class OrdersController : ApiController { [Route("customers/{customerId}/orders")] [HttpGet] public IEnumerable<Order> FindOrdersByCustomer(int customerId) { ... } }
now tell me how
FindOrdersByCustomer()
function will be invoke when we issue the below url
http://localhost/customers/1/orders http://localhost/customers/bob/orders http://localhost/customers/1234-5678/orders
how all above route will map to action method called
FindOrdersByCustomer
? please help me to understand this area.
4) Just do not understand the meaning of
AcceptVerbs("MKCOL")
what is
MKCOL
?
5) can we declare multiple post type action in a single web api controller ?
if possible then give me few sample code for multiple post type action in a web api controller.
6) see the code
[RoutePrefix("orders")] public class OrdersController : ApiController { [Route("{id:int}")] // constrained parameter public HttpResponseMessage Get(int id) { ... } [Route("details")] // literal public HttpResponseMessage GetDetails() { ... } [Route("pending", RouteOrder = 1)] public HttpResponseMessage GetPending() { ... } [Route("{customerName}")] // unconstrained parameter public HttpResponseMessage GetByCustomer(string customerName) { ... } [Route("{*date:datetime}")] // wildcard public HttpResponseMessage Get(DateTime date) { ... } }
These routes are ordered as follows.
orders/details orders/{id} orders/{customerName} orders/{*date} orders/pending
what does mean
RouteOrder = 1
?
what is the meaning of wild card in route
[Route("{*date:datetime}")] // wildcard
just do not understand route order in web api. can anyone elaborate with some easy sample to understand what it is and its significance.
7) Do not understand
To allow multiple HTTP methods for an action, or to allow HTTP methods other than GET, PUT, POST, and DELETE, use the AcceptVerbs attribute, which takes a list of HTTP methods.
public class ProductsController : ApiController { [AcceptVerbs("GET", "HEAD")] public Product FindProduct(id) { } // WebDAV method [AcceptVerbs("MKCOL")] public void MakeCollection() { } }
[AcceptVerbs("GET", "HEAD")]
i understand action
GET
but what is
Head
? what is this
[AcceptVerbs("MKCOL")]
please answer point wise if possible. thanks
Thursday, November 5, 2015 1:41 PM
Answers
-
User753101303 posted
It might be best to not ask too much in a single post. It will be easier to stop for what you understood or to keep discussing when you need more information. Also it is easier for others to answer to what they know best etc... etc... If we end up discussing too much things at the same time it will be harder to follow.
In short :
1: it is a way to ask the website "show me all orders for Customer 1"
2: this is precisely what explains the article. The attribute allows to tell that when the pattern looks like customers/<something>/orders it should call this method (GetOrdersByCustomer)
3: if I remember we discussed that already. Basically a piece of code can inspect programming elements at runtime, inspect attributes and ultimately create object and invoke methods. So you have a piece of code in MVC, that inspect the incoming request and find the matching action based on this attribute. You can write code that inspect other code elements.
4: you likely know GET and POST. It is just another "http verb" intended to create a "collection" (ie a "folder"). It allows to define yet another criteria to tell if the icnming request should be mapped to this particular action
5: try http://forums.asp.net/t/1815996.aspx?Web+Api+with+Multiple+Post+in+one+Controller. not sure to be able to quickly find a scenario where it is obviusly needed. IMO it will be always the time to ask if you ever come accross a case where you need it.
6a: as explained it allows to tell in which order you want to check those routes (the first one that match is taken so you may want to prioritize that... once again if you REALLY need)
6b:* should mean you could have other "segments" before (ie it could be reports/<a date value> or whatever/<a date value>)
7:MKCOL was discussed previously. HEAD is like GET except the content is not returned (for example you should be able to use that to check that something exists without actually downloading it). As this is not widely used, they mean that by design GET, PUT, POST, DELETE are allowed and that if you ever want to allow other HTTP verbs or to map multiple verbs to an action, then you need to explicitely allow that using the "AcceptVerbs" attribute.- Marked as answer by Anonymous Thursday, October 7, 2021 12:00 AM
Thursday, November 5, 2015 2:22 PM