设为首页 收藏本站
查看: 2121|回复: 0

[经验分享] 如何在Mvc 6 中创建 Web Api以及如何脱离IIS实现自我托管

[复制链接]

尚未签到

发表于 2015-8-12 10:09:55 | 显示全部楼层 |阅读模式
  微软推出的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 就可以了 :
DSC0000.png
  
  
  项目包括如下几个文件:
DSC0001.png


  • 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 。添加的时候会有只能提示。
   DSC0002.png
  
  


  "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 运行 效果就出来了:
DSC0003.png
  
  简单的创建了一个页面,接下来我们就进入正题,创建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 看看效果:
DSC0004.png
  我们发现每次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
DSC0005.png
  
  然后F5运行:
DSC0006.png
  这样程序就托管成功了。打开浏览器输入地址:
DSC0007.png
  
  Ok成功了。关于asp.net 5.0 的一些新特性我还在研究,以后我还会发布相关的文章。Asp.net 5.0 这次的变动真的非常的让人激动。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-97809-1-1.html 上篇帖子: 利用windbg查找dictionary导致IIS占CPU100%案例分析(一) 下篇帖子: 让我纠结的IIS和他的回收
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表