首页 > 代码库 > [转] Asp.net vNext webapi 自托管

[转] 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 Startup2 {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 Startup2     {3         public void Configure(IApplicationBuilder app)4         {5             // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=3989406 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 Test2     {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         // DELETE api/values/5 96         [HttpDelete("{id}")] 97         public IActionResult Delete(int id) 98         { 99 100             var item = list.FirstOrDefault(x => x.Id == id);101             if (item == null)102             {103                 return HttpNotFound();104             }105             list.Remove(item);106             return new HttpStatusCodeResult(204); 107         }108     }109 }

该注释的我已经注释了。ok 看看效果:

技术分享

我们发现每次f5 运行项目的时候都要通过运行IIS Express 我们才能运行我们的程序,那么有没有可能不通过IIS也能运行我们的程序呢?对于asp.net 5.0 来说答案是肯定的。 我们看一下是怎么做的? asp.net 5.0 可以托管到多种的web server 上 ,这里选择WebListener。即我们可以通过控制台来托管我们程序。

首先在 project.json 中添加Microsoft.AspNet.Server.WebListener包。另外还需要新加一个 "commands" 的设置完整的内容如下:

 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         "Microsoft.AspNet.Diagnostics": "1.0.0-beta1",15         "Microsoft.AspNet.Mvc": "6.0.0-beta1",16         "Microsoft.AspNet.Server.WebListener": "1.0.0-beta1"17     },18     "frameworks": {19         "aspnet50": { },20         "aspnetcore50": { }21     },22     "commands": {23         "web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5000"24     }25 26 }

然后右键项目属性的debug 选项 设置debug target 为web

技术分享

 

然后F5运行:

技术分享

这样程序就托管成功了。打开浏览器输入地址:

技术分享

 

Ok成功了。关于asp.net 5.0 的一些新特性我还在研究,以后我还会发布相关的文章。Asp.net 5.0 这次的变动真的非常的让人激动。

【声明】本文转自:http://www.cnblogs.com/ListenCode/p/4206204.html  

            转载需注明!

[转] Asp.net vNext webapi 自托管