ASP.Net Web API 学习笔记

这篇笔记所用的技术版本:

Web API 2

VS2017

1. If you have used ASP.NET MVC, you are already familiar with controllers. Web API controllers are similar to MVC controllers, but inherit the ApiController class instead of the Controller class.

2. If you are familiar with ASP.NET MVC, Web API routing is very similar to MVC routing. The main difference is that Web API uses the HTTP method, not the URI path, to select the action. You can also use MVC-style routing in Web API.3

3. Controller是用来负责handle http的request的. 但是具体哪个request invoke的是哪个action, 需要进行一个配置. 叫做routing tables, 在web api项目里面一般是 WebApiConfig.cs这个文件.

 1 public static class WebApiConfig
 2     {
 3         public static void Register(HttpConfiguration config)
 4         {
 5             // Web API configuration and services
 6 
 7             // Web API routes
 8             config.MapHttpAttributeRoutes();
 9 
10             config.Routes.MapHttpRoute(
11                 name: "DefaultApi",
12                 routeTemplate: "api/{controller}/{id}",
13                 defaults: new { id = RouteParameter.Optional }
14             );
15         }
16     }
WebApiConfig

之后需要通过一个 GlobalConfiguration去配置.

 1 public class WebApiApplication : System.Web.HttpApplication
 2     {
 3         protected void Application_Start()
 4         {
 5             GlobalConfiguration.Configure(config =>
 6             {
 7                 config.MapHttpAttributeRoutes();
 8 
 9                 config.Routes.MapHttpRoute(
10                     name: "DefaultApi",
11                     routeTemplate: "api/{controller}/{id}",
12                     defaults: new { id = RouteParameter.Optional }
13                 );
14             });
15         }
16     }
WebApiApplication

4. 如果希望controller中的方法不会作为action去被invoke, 则需要加上一个[NonAction]属性

5. 一个web api的controller的action可以返回的内容有: void, HttpReponseMessage, IHttpActionResult,等等, 可以参考下面的列表:

Return type How Web API creates the response
void Return empty 204 (No Content)
HttpResponseMessage Convert directly to an HTTP response message.
IHttpActionResult Call ExecuteAsync to create an HttpResponseMessage, then convert to an HTTP response message.
Other type Write the serialized return value into the response body; return 200 (OK).
扫描二维码关注公众号,回复: 1068061 查看本文章
1 public interface IHttpActionResult
2 {
3     Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken);
4 }
IHttpActionResult
 1 public class TextResult : IHttpActionResult
 2 {
 3     string _value;
 4     HttpRequestMessage _request;
 5 
 6     public TextResult(string value, HttpRequestMessage request)
 7     {
 8         _value = value;
 9         _request = request;
10     }
11     public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
12     {
13         var response = new HttpResponseMessage()
14         {
15             Content = new StringContent(_value),
16             RequestMessage = _request
17         };
18         return Task.FromResult(response);
19     }
20 }
TextResult
1 public class ValuesController : ApiController
2 {
3     public IHttpActionResult Get()
4     {
5         return new TextResult("hello", Request);
6     }
7 }
ValuesController

6. Controller 中声明的方法被称为Action methods, 或者直接叫做Actions.

7. Routing有三个阶段: 1. 寻找匹配的URI 路由模板. 2. 选择一个Controller. 3. 选择一个action.

8. web api2 中, Controller中什么样的方法被认为是一个Action.

  启动attribute routing: 在WebAPIConfig文件中, config.MapHttpAttributeRoutes().

9. web api2中的attribute rout, 可以在Controller上面加上[RoutePrefix], 然后在action上面加上[HttpMethod, Route("")]

10. 在attribute中可以设置一个name属性去指定某个route.RouteOrder属性去指定升序或降序

  

 1 public class BooksController : ApiController
 2 {
 3     [Route("api/books/{id}", Name="GetBookById")]
 4     public BookDto GetBook(int id) 
 5     {
 6         // Implementation not shown...
 7     }
 8 
 9     [Route("api/books")]
10     public HttpResponseMessage Post(Book book)
11     {
12         // Validate and add book to database (not shown)
13 
14         var response = Request.CreateResponse(HttpStatusCode.Created);
15 
16         // Generate a link to the new book and set the Location header in the response.
17         string uri = Url.Link("GetBookById", new { id = book.BookId });
18         response.Headers.Location = new Uri(uri);
19         return response;
20     }
21 }
BooksController

猜你喜欢

转载自www.cnblogs.com/it-dennis/p/9078293.html