zoukankan      html  css  js  c++  java
  • 如何在Mvc 6 中创建 Web Api以及如何脱离IIS实现自我托管

       微软推出的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         // 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 这次的变动真的非常的让人激动。

  • 相关阅读:
    Go 语言入门教程,共32讲,6小时(已完结) yangxu
    JavaGuide学习Zookeeper
    javaguide学习数据库
    使用restTemplate报错:no suitable HttpMessageConverter found for response type [class java.lang.Object...
    MySQL blocked nested loop join(bnl)和index nested loop join(inl)
    spring boot中自动配置应用场景
    MySQL锁的定义
    我挖掘Kafka底层原理!发现了它火爆宇宙的3个真相!
    MySQL导致metadata lock或者flush table lock原因排查方法
    maven中parent标签的作用
  • 原文地址:https://www.cnblogs.com/ListenCode/p/4206204.html
Copyright © 2011-2022 走看看