[转] Asp.net vNext webapi 自托管
【声明】本文转自:http://www.cnblogs.com/ListenCode/p/4206204.html
转载需注明!
微软推出的Asp.net vNext(asp.net 5.0)的其中的一个目标就是统一mvc 和web api 的框架。接下来我就演示一下一下几个内容
1,怎么在Asp.net mvc 6 中创建简单的web api。
2,怎么在空的项目工程中添加程序需要的组件。
3,怎么去配置Asp.net 5.0 管道。
4,怎么不通过IIS自我托管。
首先需要安装Visual Studio 2015 Preview,安装完之后,打开File >New >Project 然后 Template>C#>Web 新建一个Asp.Net Web Application 我命名为WebApiDemo:之后要选择 Asp.net 5 Empty 然后选择ok 就可以了 :
项目包括如下几个文件:
- global.json 是包括整个solution的设置并且可以确保项目和项目之间的引用。
- project.json 是这个工程的配置。
- Startup.cs 是 startup 和 配置的代码。
在Startup.cs 中配置asp.net 的请求管道,
1 public class Startup
2 {
3 public void Configure(IApplicationBuilder app)
4 {
5 // Nothing here!
6 }
7 }
如果现在运行项目会发现什么也没有,那我们就先简单的添加一个欢迎页面,打开project.json 文件,这个文件可以配置我们这个程序的一些设置
1 {
2 "webroot": "wwwroot",
3 "version": "1.0.0-*",
4 "exclude": [
5 "wwwroot"
6 ],
7 "packExclude": [
8 "**.kproj",
9 "**.user",
10 "**.vspscc"
11 ],
12 "dependencies": {
13 "Microsoft.AspNet.Server.IIS": "1.0.0-beta1"
14 },
15 "frameworks" : {
16 "aspnet50" : { },
17 "aspnetcore50" : { }
18 }
19 }
其中 "dependencies" 是一些Nuget 包和类库。我们先添加一个 Microsoft.AspNet.Diagnostics 。添加的时候会有只能提示。
"dependencies": { "Microsoft.AspNet.Server.IIS": "1.0.0-beta1", "Microsoft.AspNet.Diagnostics": "1.0.0-beta1" },
然后再Startup.cs 中添加
1 public class Startup
2 {
3 public void Configure(IApplicationBuilder app)
4 {
5 // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940
6
7 app.UseWelcomePage();
8 }
9 }
然后f5 运行 效果就出来了:
简单的创建了一个页面,接下来我们就进入正题,创建web api。
同样我们需要在project.json 中添加mvc 6的包
1 "dependencies": {
2 "Microsoft.AspNet.Server.IIS": "1.0.0-beta1",
3 "Microsoft.AspNet.Diagnostics": "1.0.0-beta1",
4 "Microsoft.AspNet.Mvc": "6.0.0-beta1"
5 },
接下来添加mvc 的请求管道在startup.cs 中
先引用 Microsoft.Framework.DependencyInjection,
然后添加如下方法:
1 public void ConfigureServices(IServiceCollection services)
2 {
3
4 services.AddMvc();
5 }
注意方法名不要错了,在程序启动的时候 mvc 框架会自动运行这个方法。
然后在 Startup.cs 的configure方法中添加代码: app.UseMvc();
然后新建一个Models文件夹 里面新建一个类Test
1 public class Test
2 {
3 public int Id { get; set; }
5 [Required]
6 public string Title { get; set; }
7 }
同样新建一个文件夹Controller 然后新建一个HomeController 的Wep Api 的 controller。
1 namespace WebApiDemo.Controllers.Controllers
2 {
3 //注意这个写法,web api 的路由 不要忘了前面的api当然你可以随意的命名
4 [Route("api/[controller]")]
5 public class HomeController : Controller
6 {
7
8 public static List<Test> list = new List<Test>() {
9 new Test() { Id=1, Title="test1" },
10 new Test() { Id=2, Title="test2" }
11 };
12
13
14
15 // GET: api/values
16 //获得所有数据
17 [HttpGet]
18 public IEnumerable<Test> Get()
19 {
20 return list;
21 }
22
23 //按照id 查找数据 其中HttpGet 中 {id} 是模板 Name是路由的名字在mvc 5中的api 中HttpGet 是没有参数的。
24 // GET api/values/5
25 [HttpGet("{id}", Name = "getbyid")]
26 public IActionResult Get(int id)
27 {
28 var item = list.FirstOrDefault(p => p.Id.Equals(id));
29
30 if (item == null)
31 {
32 return HttpNotFound();
33 }
34
35 return new ObjectResult(item);
36
37 }
38
39 // POST api/values
40 //添加数据
41 [HttpPost]
42 public void Post([FromBody]Test value)
43 {
44 if (!ModelState.IsValid)
45 {
46 Context.Response.StatusCode = 400;
47 }
48 else
49 {
50 value.Id = list.Max(p => p.Id) + 1;
51 list.Add(value);
52
53 string url = Url.RouteUrl("getbyid", new { id = value.Id });
54
55 Context.Response.StatusCode = 201;
56 //添加成功之后,跳转看是否添加成功
57 Context.Response.Headers["Location"] = url;
58 }
59
60
61 }
62
63 //更新数据
64 // PUT api/values/5
65 [HttpPut("{id}")]
66 public IActionResult Put(int id, [FromBody]Test value)
67 {
68 if (!ModelState.IsValid)
69 {
70 return new HttpStatusCodeResult(500);
71 }
72 else
73 {
74 var item = list.FirstOrDefault(p => p.Id.Equals(id));
75
76 if (item == null)
77 {
78 return HttpNotFound();
79 }
80 else
81 {
82
83 value.Id = item.Id;
84
85 list.Remove(item);
86 list.Add(value);
87
88 return new ObjectResult(value);
89 }
90
91 }
92 }
93
94 //删除数据
95