威尼斯人线上娱乐

电动完毕高质量MVC,MVC官方教程索引

31 3月 , 2019  

  wcf就算成效多、扩张性强然而也面临配置忒多,而且restful的效应优异古怪,并且近日没办法移植。asp.net
core纵然援助webapi,可是意义也针锋相对繁多、配置复杂。就没有三个能让码农们安安心心的写webapi,无需考虑品质、配置、甚至依照难题场景自行设计、改造等题材的方案么?

     
  摘要:“约定优于配备”这是1个一定棒的经验,SOAP服务特性差、基于配置、紧耦合,restful服务属性好、基于约定、松耦合,未来自个儿就把利用Spring
MVC宣布restful服务的进度同大家享用。代码之优雅、进程之简明、编码之快意,不是发布SOAP服务所能匹敌的。

怎么才能成为一名架构师?必要全体何条件?

1.MVC教程首页
http://www.asp.net/learn/mvc/?lang=cs

  当然不是,尤其是在dnc2.0早已格外强劲的此时,完全可以自行设计一套简洁、高效的webapi框架!说到活动写一套框架,很多码农们就恐怕会想到开发工作量难以想像,事实当真如此么?java因为开源众多,很多对mvc稍有驾驭的都足以拿那一个拿那些拼出二个自已的mvc框架;而面对日渐强硬的dnc,本人认为C#素有无需东拼西凑这么劳碌,完全能够依据自已的供给简单高效的写出二个来,不服就开干!

       
关键字:java, rest, webservice, spring mvc

电动完毕高质量MVC,MVC官方教程索引。作为一名码农作者火急希望本身变成1个对比合格的web架构师,明儿早上心血来潮小叔子花了五个小时的岁月整了个简易的web开发框架,本着开源的旺盛做个享受,希望和越来越多的好手交流,由于第2回搭建框架难免有不足之处,希望今日头条的大咖们给予携带!同时代待有大神肯收作者做学徒,笔者乐意追随学习!!!

2.MVC概况
2.1创制三个基于数据库的”电影”web应用
http://www.asp.net/learn/mvc/tutorial-21-cs.aspx

  设计的编码思路就是仿asp.net mvc,原因就算asp.net
mvc成功发展了那样多年,有着大量的C#码农习惯了那套精美的编码格局;至于spring
mvc、spring
boot那一个,站在使用者的角度来说,光配置和注释都能敲死人,如要要说简练飞速,asp.net
mvc比她强多了,更别提ruby on
rails。不扯远了,上边就按C#经典来。那么必要考虑的标题有tcp、http、request、response、server、controller、actionresult、routetable等,上面就相继来缓解这么些题材。

     
  前提:IntelliJ IDEA (13.1.5 版本), apache
maven (3.2.3 版本), Tomcat(7.0.56版本),
Spring(3.2.4版本)

架构表达:ASP.NET MVC5+EntityFramewrok6.1+Sql Server+Redis+Unity

2.2MVC执行进度
http://www.asp.net/learn/mvc/tutorial-22-cs.aspx

  一、Tcp:其一是实现传输通讯的底层,当然采取IOCP来坚实吞吐量和性子,本身从前在做Redis
Client等的时候就应用这一个IOCP
Socket的框架,此时刚好也能够用上


先上图

2.3理解Models(模型),View(视图),Controllers(控制器)
http://www.asp.net/learn/mvc/tutorial-22-cs.aspx

 1 /****************************************************************************
 2 *Copyright (c) 2018 Microsoft All Rights Reserved.
 3 *CLR版本: 4.0.30319.42000
 4 *机器名称:WENLI-PC
 5 *公司名称:Microsoft
 6 *命名空间:SAEA.WebAPI.Http.Net
 7 *文件名: ServerSocket
 8 *版本号: V1.0.0.0
 9 *唯一标识:ab912b9a-c7ed-44d9-8e48-eef0b6ff86a2
10 *当前的用户域:WENLI-PC
11 *创建人: yswenli
12 *电子邮箱:wenguoli_520@qq.com
13 *创建时间:2018/4/8 17:11:15
14 *描述:
15 *
16 *=====================================================================
17 *修改标记
18 *修改时间:2018/4/8 17:11:15
19 *修改人: yswenli
20 *版本号: V1.0.0.0
21 *描述:
22 *
23 *****************************************************************************/
24 using SAEA.Sockets.Core;
25 using SAEA.Sockets.Interface;
26 using System;
27 using System.Collections.Generic;
28 using System.Net;
29 using System.Text;
30 
31 namespace SAEA.WebAPI.Http.Net
32 {
33     class ServerSocket : BaseServerSocket
34     {
35         public event Action<IUserToken, string> OnRequested;
36 
37         public ServerSocket(int bufferSize = 1024 * 100, int count = 10000) : base(new HContext(), bufferSize, true, count)
38         {
39 
40         }
41 
42         protected override void OnReceiveBytes(IUserToken userToken, byte[] data)
43         {
44             HCoder coder = (HCoder)userToken.Coder;
45 
46             coder.GetRequest(data, (result) =>
47             {
48                 OnRequested?.Invoke(userToken, result);
49             });
50         }
51 
52         public void Reply(IUserToken userToken, byte[] data)
53         {
54             base.Send(userToken, data);
55             base.Disconnected(userToken);
56         }
57     }
58 }

 

威尼斯人线上娱乐 1

3.路由
3.1路由概述
http://www.asp.net/learn/mvc/tutorial-05-cs.aspx

  二、Http:以此是个应用协议,本身领会下来至少有贰个本子,完全熟知的话估量没个3个月都搞不定;可是只须要注重,比如说http1.1的做事情势、传输格式、常见非常code、常见mime类型、js跨域扶助等,那几个宗旨能遮住绝大部分日常境况,至于越多的那几个琐事的理它作甚,自己的做法正是用Chrome的开发职职员和工人具来查占卜关network详情,这样的话就可以清楚http这几个体协会议的切切实实编码解码了。

     
  

1.Controllers 用于mvc中的controller以及webapi

3.2创设自定义路由
http://www.asp.net/learn/mvc/tutorial-23-cs.aspx

 1         public void GetRequest(byte[] data, Action<string> onUnpackage)
 2         {
 3             lock (_locker)
 4             {
 5                 var str = Encoding.UTF8.GetString(data);
 6 
 7                 var index = str.IndexOf(ENDSTR);
 8 
 9                 if (index > -1)
10                 {
11                     var s = str.Substring(0, index);
12 
13                     _result.Append(s);
14 
15                     onUnpackage.Invoke(_result.ToString());
16 
17                     _result.Clear();
18 
19                     if (str.Length > index + 4)
20                     {
21                         _result.Append(str.Substring(index + 4));
22                     }
23                 }
24                 else
25                 {
26                     _result.Append(str);
27                 }
28             }
29         }

  “约定优于配备”那是2个很厉害的经验,对于自己的话,大概是自“面向对象”以来对本人最大碰撞的见解了吧。首先,SOAP服务能够说是依照配置的,它在HTTP的底子上行使XML配置发挥服务与数据,为了兑现长途访问,它生成的劳动音讯更是复杂,无论是C#客户端如故JAVA客户端,甚至足以因此WSDL服务描述来自动生成一整套代码,那样基于配置的劳动的败笔就在于服务端与客户端具备较强的编码耦合性,服务端接口修改后,必要对客户端的劳务信赖代码重新生成。而restful服务是依照约定的,是http的get、delete、post照旧put都约定好了差别的意思,大家依照约定来展开http请求便足以达成各式的操作。更不用说SOAP服务的性质之差、与restful服务不是四个多少级之缺点了。基于约定,我们得以兑现代码间的松耦合。即便Hessian质量略优于restful服务、其实是一个数目级、restful编解码做好了就品质差不离,但Hessian也照旧依据代码的紧耦合了。

威尼斯人线上娱乐 2

3.3创造路由限制
http://www.asp.net/learn/mvc/tutorial-24-cs.aspx

  经过分析后http的内容格式其实就是字符回车分隔,再增加部分预约生成的相间符bound完结的。

 

2.Data 重如果EntityFramework 数据访问

3.4创办自定义路由限制
http://www.asp.net/learn/mvc/tutorial-25-cs.aspx

 1         public HttpRequest(Stream stream)
 2         {
 3             this._dataStream = stream;
 4             var data = GetRequestData(_dataStream);
 5             var rows = Regex.Split(data, Environment.NewLine);
 6 
 7             //Request URL & Method & Version
 8             var first = Regex.Split(rows[0], @"(\s+)")
 9                 .Where(e => e.Trim() != string.Empty)
10                 .ToArray();
11             if (first.Length > 0) this.Method = first[0];
12             if (first.Length > 1)
13             {
14                 this.Query = first[1];
15 
16                 if (this.Query.Contains("?"))
17                 {
18                     var qarr = this.Query.Split("?");
19                     this.URL = qarr[0];
20                     this.Params = GetRequestParameters(qarr[1]);
21                 }
22                 else
23                 {
24                     this.URL = this.Query;
25                 }
26 
27                 var uarr = this.URL.Split("/");
28 
29                 if (long.TryParse(uarr[uarr.Length - 1], out long id))
30                 {
31                     this.URL = this.URL.Substring(0, this.URL.LastIndexOf("/"));
32                     this.Params.Set("id", id.ToString());
33                 }
34             }
35             if (first.Length > 2) this.Protocols = first[2];
36 
37             //Request Headers
38             this.Headers = GetRequestHeaders(rows);
39 
40             //Request "GET"
41             if (this.Method == "GET")
42             {
43                 this.Body = GetRequestBody(rows);
44             }
45 
46             //Request "POST"
47             if (this.Method == "POST")
48             {
49                 this.Body = GetRequestBody(rows);
50                 var contentType = GetHeader(RequestHeaderType.ContentType);
51                 var isUrlencoded = contentType == @"application/x-www-form-urlencoded";
52                 if (isUrlencoded) this.Params = GetRequestParameters(this.Body);
53             }
54         }

     
  首先,大家先在IDEA中新建贰个名为dp-parent的Project,作为持有工程的父节点,其<packaging>pom</packaging>。然后,我们在dp-parent下新建三个名为dp-restfulservice的Module,其<packaging>war</packaging>,并在其pom.xml中添加其所需的spring注重。如:

威尼斯人线上娱乐 3

4.控件器
4.1控件器概述
http://www.asp.net/learn/mvc/tutorial-03-cs.aspx

  看到上面,有人肯定会说你那些传文书怎么办?三个呢本人这几个是针对webapi;别的1个,如真有这些情形,能够用Chrome的开发职员工具来查占星关network详情,也能够利用httpanalyzerstd、httpwatch等许多工具分析下,其实约等于应用了部分预定的相间符bound实现,每一种浏览器还不一致等,有趣味的通通能够自动扩大一个。

 

3.Interface 天地接口定义

4.2成立控件器
http://www.asp.net/learn/mvc/tutorial-33-cs.aspx

  叁 、Reponse这些是webapi服务端万分首要的二个组件,自个儿也是不择手段方便而且按尽量按asp.net
mvc的命名来贯彻,其余那里进入援助js跨域所需大多数情形heads,假若还有独特的heads,完全可以自已添加。

<dependency>
           
<groupId>org.springframework</groupId>
           
<artifactId>spring-context</artifactId>
           
<version>3.2.4.RELEASE</version>
</dependency>

威尼斯人线上娱乐 4

4.3创办Action处理措施
http://www.asp.net/learn/mvc/tutorial-34-cs.aspx

威尼斯人线上娱乐 5威尼斯人线上娱乐 6

        

4.Service 领域接口的完成,用于controller及webapi中

5.视图
5.1视图概述
http://www.asp.net/learn/mvc/tutorial-04-cs.aspx

  1 /****************************************************************************
  2 *Copyright (c) 2018 Microsoft All Rights Reserved.
  3 *CLR版本: 4.0.30319.42000
  4 *机器名称:WENLI-PC
  5 *公司名称:Microsoft
  6 *命名空间:SAEA.WebAPI.Http
  7 *文件名: HttpResponse
  8 *版本号: V1.0.0.0
  9 *唯一标识:2e43075f-a43d-4b60-bee1-1f9107e2d133
 10 *当前的用户域:WENLI-PC
 11 *创建人: yswenli
 12 *电子邮箱:wenguoli_520@qq.com
 13 *创建时间:2018/4/8 16:46:40
 14 *描述:
 15 *
 16 *=====================================================================
 17 *修改标记
 18 *修改时间:2018/4/8 16:46:40
 19 *修改人: yswenli
 20 *版本号: V1.0.0.0
 21 *描述:
 22 *
 23 *****************************************************************************/
 24 using SAEA.Commom;
 25 using SAEA.Sockets.Interface;
 26 using SAEA.WebAPI.Http.Base;
 27 using SAEA.WebAPI.Mvc;
 28 using System.Collections.Generic;
 29 using System.Net;
 30 using System.Text;
 31 
 32 namespace SAEA.WebAPI.Http
 33 {
 34     public class HttpResponse : BaseHeader
 35     {
 36         public HttpStatusCode Status { get; set; } = HttpStatusCode.OK;
 37 
 38         public byte[] Content { get; private set; }
 39 
 40 
 41 
 42         internal HttpServer HttpServer { get; set; }
 43 
 44         internal IUserToken UserToken { get; set; }
 45         /// <summary>
 46         /// 创建一个HttpRequest实例
 47         /// </summary>
 48         /// <param name="httpServer"></param>
 49         /// <param name="userToken"></param>
 50         /// <param name="stream"></param>
 51         /// <returns></returns>
 52         internal static HttpResponse CreateInstance(HttpServer httpServer, IUserToken userToken)
 53         {
 54             HttpResponse httpResponse = new HttpResponse("");
 55             httpResponse.HttpServer = httpServer;
 56             httpResponse.UserToken = userToken;
 57             return httpResponse;
 58         }
 59 
 60         /// <summary>
 61         /// 设置回复内容
 62         /// </summary>
 63         /// <param name="httpResponse"></param>
 64         /// <param name="result"></param>
 65         internal static void SetResult(HttpResponse httpResponse, ActionResult result)
 66         {
 67             httpResponse.Content_Encoding = result.ContentEncoding.EncodingName;
 68             httpResponse.Content_Type = result.ContentType;
 69             httpResponse.Status = result.Status;
 70 
 71             if (result is EmptyResult)
 72             {
 73                 return;
 74             }
 75 
 76             if (result is FileResult)
 77             {
 78                 var f = result as FileResult;
 79 
 80                 httpResponse.SetContent(f.Content);
 81 
 82                 return;
 83             }
 84 
 85             httpResponse.SetContent(result.Content);
 86         }
 87 
 88 
 89         public HttpResponse(string content) : this(content, "UTF-8", "application/json; charset=utf-8", HttpStatusCode.OK)
 90         {
 91 
 92         }
 93 
 94         public HttpResponse(string content, string encoding, string contentType, HttpStatusCode status)
 95         {
 96             this.Content_Encoding = encoding;
 97             this.Content_Type = contentType;
 98             this.Status = status;
 99             this.SetContent(content);
100         }
101 
102         internal HttpResponse SetContent(byte[] content, Encoding encoding = null)
103         {
104             this.Content = content;
105             this.Encoding = encoding != null ? encoding : Encoding.UTF8;
106             this.Content_Length = content.Length.ToString();
107             return this;
108         }
109 
110         internal HttpResponse SetContent(string content, Encoding encoding = null)
111         {
112             //初始化内容
113             encoding = encoding != null ? encoding : Encoding.UTF8;
114             return SetContent(encoding.GetBytes(content), encoding);
115         }
116 
117 
118         public string GetHeader(ResponseHeaderType header)
119         {
120             return base.GetHeader(header);
121         }
122 
123         public void SetHeader(ResponseHeaderType header, string value)
124         {
125             base.SetHeader(header, value);
126         }
127 
128         /// <summary>
129         /// 构建响应头部
130         /// </summary>
131         /// <returns></returns>
132         protected string BuildHeader()
133         {
134             StringBuilder builder = new StringBuilder();
135             builder.Append(Protocols + SPACE + Status.ToNVString() + ENTER);
136             builder.AppendLine("Server: Wenli's Server");
137             builder.AppendLine("Keep-Alive: timeout=20");
138             builder.AppendLine("Date: " + DateTimeHelper.Now.ToFString("r"));
139 
140             if (!string.IsNullOrEmpty(this.Content_Type))
141                 builder.AppendLine("Content-Type:" + this.Content_Type);
142 
143             //支持跨域
144             builder.AppendLine("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");
145             builder.AppendLine("Access-Control-Allow-Origin: *");
146             builder.AppendLine("Access-Control-Allow-Headers: Content-Type,X-Requested-With,Accept,yswenli");//可自行增加额外的header
147             builder.AppendLine("Access-Control-Request-Methods: GET, POST, PUT, DELETE, OPTIONS");
148 
149             if (this.Headers != null && this.Headers.Count > 0)
150             {
151                 foreach (var key in Headers.Names)
152                 {
153                     builder.AppendLine($"{key}: {Headers[key]}");
154                 }
155             }
156 
157             return builder.ToString();
158         }
159 
160         /// <summary>
161         /// 生成数据
162         /// </summary>
163         private byte[] ToBytes()
164         {
165             List<byte> list = new List<byte>();
166             //发送响应头
167             var header = BuildHeader();
168             byte[] headerBytes = this.Encoding.GetBytes(header);
169             list.AddRange(headerBytes);
170 
171             //发送空行
172             byte[] lineBytes = this.Encoding.GetBytes(System.Environment.NewLine);
173             list.AddRange(lineBytes);
174 
175             //发送内容
176             list.AddRange(Content);
177 
178             return list.ToArray();
179         }
180 
181 
182         public void Write(string str)
183         {
184             SetContent(str);
185         }
186 
187         public void BinaryWrite(byte[] data)
188         {
189             SetContent(data);
190         }
191 
192         public void Clear()
193         {
194             this.Write("");
195         }
196 
197         public void End()
198         {
199             HttpServer.Replay(UserToken, this.ToBytes());
200             HttpServer.Close(UserToken);
201         }
202 
203 
204 
205     }
206 }

       
其次,我们在src/main目录下开创名为webapp的目录,为何要叫这些名字啊?那实际上也是一个预定。并且,大家在webapp目录下开创名为WEB-INF的目录(为何要叫这么些名字吧?那其实也是2个预订)。在WEB-INF目录下创建名为web.xml的文本(为何要叫这些名字吧?那实在也是一个预订,这句话小编说了太多遍了,“约定优于配备”此意见真是百试不爽)。上边是web.xml的基本点内容。

威尼斯人线上娱乐 7

5.2创立自定义的Html Helpers工具
http://www.asp.net/learn/mvc/tutorial-09-cs.aspx

View Code

 

5.Model不用说了,仅领域实体

5.3用表格来显示数据
http://www.asp.net/learn/mvc/tutorial-11-cs.aspx

  四、HttpServer:其一正是承载webapi的器皿;有人说不是有IIS和Apache么?本身想说的是:有self-host方便么?有无需安装,无需配置、随便高质量开跑好么?asp.net
core里面都有了那几个,没那一个就从不逼格….(此处省略30000字),前边还研讨tcp、http那个本来不可能少了

<?xml
version=”1.0″
encoding=”UTF-8″?>
<web-app
xmlns=””
       
 xmlns:xsi=””
       
 xsi:schemaLocation=”

       
 version=”3.1″>
   
<servlet>
       
<servlet-name>restful</servlet-name>
       
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
       
<load-on-startup>1</load-on-startup>
   
</servlet>
   
<servlet-mapping>
       
<servlet-name>restful</servlet-name>
       
<url-pattern>/</url-pattern>
   
</servlet-mapping>
</web-app>

6.Framework
缓存,控制反转容器包装、webapi、wcf调用、Linq扩张等通用操作工具类的定义

5.4使用TagBuilder扩展Html Helpers
http://www.asp.net/learn/mvc/tutorial-35-cs.aspx

 1 /****************************************************************************
 2 *Copyright (c) 2018 Microsoft All Rights Reserved.
 3 *CLR版本: 4.0.30319.42000
 4 *机器名称:WENLI-PC
 5 *公司名称:Microsoft
 6 *命名空间:SAEA.WebAPI.Http
 7 *文件名: HttpServer
 8 *版本号: V1.0.0.0
 9 *唯一标识:914acb72-d4c4-4fa1-8e80-ce2f83bd06f0
10 *当前的用户域:WENLI-PC
11 *创建人: yswenli
12 *电子邮箱:wenguoli_520@qq.com
13 *创建时间:2018/4/10 13:51:50
14 *描述:
15 *
16 *=====================================================================
17 *修改标记
18 *修改时间:2018/4/10 13:51:50
19 *修改人: yswenli
20 *版本号: V1.0.0.0
21 *描述:
22 *
23 *****************************************************************************/
24 using SAEA.Sockets.Interface;
25 using SAEA.WebAPI.Common;
26 using SAEA.WebAPI.Http.Net;
27 using System;
28 using System.Collections.Generic;
29 using System.IO;
30 using System.Text;
31 
32 namespace SAEA.WebAPI.Http
33 {
34     class HttpServer
35     {
36         ServerSocket _serverSocket;
37 
38         public HttpServer()
39         {
40             _serverSocket = new ServerSocket();
41             _serverSocket.OnRequested += _serverSocket_OnRequested;
42         }
43 
44         public void Start(int port = 39654)
45         {
46             _serverSocket.Start(port);
47         }
48 
49 
50         private void _serverSocket_OnRequested(IUserToken userToken, string htmlStr)
51         {
52             var httpContext = HttpContext.CreateInstance(this, userToken, htmlStr);
53 
54             var response = httpContext.Response;
55 
56             response.End();
57         }
58 
59         internal void Replay(IUserToken userToken, byte[] data)
60         {
61             _serverSocket.Reply(userToken, data);
62         }
63 
64         internal void Close(IUserToken userToken)
65         {
66             _serverSocket.Disconnected(userToken);
67         }
68 
69 
70     }
71 }

 

7.WebApp不用说了吧

6.模型
6.1使用实体框架(Entity Framework)创造模型
http://www.asp.net/learn/mvc/tutorial-16-cs.aspx

   五、Controller:为了贯彻类似于mvc的效劳Controller这几个盛名的自然不能够少了,其在C#中利用尤其微量的代码即可兑现

       
然后,大家要在WEB-INF目录下开创三个名为restful-servlet.xml的文件(为啥要叫那些名字吧?那实在也是2个预约,在web.xml中规定的servlet-name加上-servlet约定为servlet配置文件名)。restful-servlet.xml文件的机要内容如下。

威尼斯人线上娱乐 8

6.2使用Linq to Sql创立模型
http://www.asp.net/learn/mvc/tutorial-10-cs.aspx

 1 /****************************************************************************
 2 *Copyright (c) 2018 Microsoft All Rights Reserved.
 3 *CLR版本: 4.0.30319.42000
 4 *机器名称:WENLI-PC
 5 *公司名称:Microsoft
 6 *命名空间:SAEA.WebAPI.Mvc
 7 *文件名: Controller
 8 *版本号: V1.0.0.0
 9 *唯一标识:a303db7d-f83c-4c49-9804-032ec2236232
10 *当前的用户域:WENLI-PC
11 *创建人: yswenli
12 *电子邮箱:wenguoli_520@qq.com
13 *创建时间:2018/4/10 13:58:08
14 *描述:
15 *
16 *=====================================================================
17 *修改标记
18 *修改时间:2018/4/10 13:58:08
19 *修改人: yswenli
20 *版本号: V1.0.0.0
21 *描述:
22 *
23 *****************************************************************************/
24 
25 using SAEA.WebAPI.Http;
26 
27 namespace SAEA.WebAPI.Mvc
28 {
29     /// <summary>
30     /// WebApi控制器
31     /// </summary>
32     public abstract class Controller
33     {
34         public HttpContext HttpContext { get; set; }
35 
36         /// <summary>
37         /// 返回Json
38         /// </summary>
39         /// <param name="data"></param>
40         /// <returns></returns>
41         protected JsonResult Json(object data)
42         {
43             return new JsonResult(data);
44         }
45         /// <summary>
46         /// 自定义内容
47         /// </summary>
48         /// <param name="data"></param>
49         /// <returns></returns>
50         protected ContentResult Content(string data)
51         {
52             return new ContentResult(data);
53         }
54 
55 
56         /// <summary>
57         /// 小文件
58         /// </summary>
59         /// <param name="filePath"></param>
60         /// <returns></returns>
61         protected FileResult File(string filePath)
62         {
63             return new FileResult(filePath);
64         }
65 
66         /// <summary>
67         /// 空结果
68         /// </summary>
69         /// <returns></returns>
70         protected EmptyResult Empty()
71         {
72             return new EmptyResult();
73         }
74     }
75 }

 

不想多写什么,直接下载源码看吗!遗憾Github机器上安装驾驭则从来尚未采取,真正必要的时候竟然忘了!

7.MVC中的输入验证
7.1简约的数额注脚
http://www.asp.net/learn/mvc/tutorial-36-cs.aspx

  六、ActionResult:是mvc里面针对reponse结果开始展览了一个http格式的卷入,本人根本实现了ContentResult、JsonResult、FileResult多个,至于别的的在WebAPI里基本上用不到。

<?xml
version=”1.0″
encoding=”UTF-8″?>
<beans
xmlns=””
     
 xmlns:xsi=””
     
 xmlns:context=””
     
 xmlns:mvc=””
     
 xsi:schemaLocation=”

;
   
<context:component-scan base-package=”com.jsc.dp.controllers”></context:component-scan>
   
<mvc:resources mapping=”/resources/**”
location=”/WEB-INF/resources/”></mvc:resources>
   
<mvc:annotation-driven/>
   
<bean class=”org.springframework.web.servlet.view.InternalResourceViewResolver”>
       
<property name=”prefix” value=”/WEB-INF/views/”/>
       
<property name=”suffix” value=”.jsp”/>
       
<!– 即使 .jsp 文件中带有
jstl,要求这一行 –>
       
<property name=”viewClass” value=”org.springframework.web.servlet.view.JstlView”/>
   
</bean>
</beans>

7.2选拔IDataErrorInfo接口完毕认证
http://www.asp.net/learn/mvc/tutorial-37-cs.aspx

 1 /****************************************************************************
 2 *Copyright (c) 2018 Microsoft All Rights Reserved.
 3 *CLR版本: 4.0.30319.42000
 4 *机器名称:WENLI-PC
 5 *公司名称:Microsoft
 6 *命名空间:SAEA.WebAPI.Mvc
 7 *文件名: JsonResult
 8 *版本号: V1.0.0.0
 9 *唯一标识:340c3ef0-2e98-4f25-998f-2bb369fa2794
10 *当前的用户域:WENLI-PC
11 *创建人: yswenli
12 *电子邮箱:wenguoli_520@qq.com
13 *创建时间:2018/4/10 16:48:06
14 *描述:
15 *
16 *=====================================================================
17 *修改标记
18 *修改时间:2018/4/10 16:48:06
19 *修改人: yswenli
20 *版本号: V1.0.0.0
21 *描述:
22 *
23 *****************************************************************************/
24 using SAEA.WebAPI.Common;
25 using System;
26 using System.Collections.Generic;
27 using System.Net;
28 using System.Text;
29 
30 namespace SAEA.WebAPI.Mvc
31 {
32     public class JsonResult : ActionResult
33     {
34         public JsonResult(object model) : this(SerializeHelper.Serialize(model))
35         {
36 
37         }
38         public JsonResult(string json) : this(json, Encoding.UTF8)
39         {
40 
41         }
42 
43         public JsonResult(string json, HttpStatusCode status)
44         {
45             this.Content = json;
46             this.ContentEncoding = Encoding.UTF8;
47             this.ContentType = "application/json; charset=utf-8";
48             this.Status = status;
49         }
50 
51         public JsonResult(string json, Encoding encoding, string contentType = "application/json; charset=utf-8")
52         {
53             this.Content = json;
54             this.ContentEncoding = encoding;
55             this.ContentType = contentType;
56         }
57     }
58 }

7.3怎么着将表达逻辑封装到一个单独的层
http://www.asp.net/learn/mvc/tutorial-38-cs.aspx

  七、RouteTable:MVC里面有3个至关心重视要的定义叫约定优先,即为Controller、Action的名目是按某种规则来写编码的,其司令员U奇骏L与自定义Controller对应起来的缓存映射正是RouteTable,并且作为缓存,也能小幅的升级换代访问质量。当然那里并不曾严厉依据asp.net
mvc里面包车型客车routetable来规划,而是依据只是达成webapi,并利用缓存反射结构能来落成的,并且唯有约定,没有安插。

     
  上面是要编写代码spring
mvc中的C(Controller)了。在main/java中成立名为com.jac.dp.controllers的包,在此包下新建2个名为AbcController的类,其通过@Controller注明注入进spring框架中。具体的restful代码如下图所示。从图中能够见见,其达成了三个名为getAbcs的形式,使用get用以对get式的 http://localhost:8088/restfulservice/abcs 
请求进行响应。还落实了1个名为getAbc的主意,使用get以对get式的 http://localhost:8088/restfulservice/abcs/3  请求实行响应,来得到某一对象,再次回到给前端的是一Json字符串:{“myInt”:3,”myString”:”myString”}。名为putAbc的格局,其应用put以对put式的 http://localhost:8088/restfulservice/abcs/3  请求举行响应,来更新某一指标。下图中也展现了,使用工具REST
Client来进展http
put请求测试的进度与结果,在此地,再次回到的是1个对象转成的Json字符串,在IDEA中得以见到其Response是:{“myInt”:-1,”myString”:”post
true”},与预期中的一样;同样的post和get也得以这么测试,测试get请求也足以直接采纳浏览器执行。 

8.母版页
8.l运用母版页创制布局
http://www.asp.net/learn/mvc/tutorial-12-cs.aspx

  1 /****************************************************************************
  2 *Copyright (c) 2018 Microsoft All Rights Reserved.
  3 *CLR版本: 4.0.30319.42000
  4 *机器名称:WENLI-PC
  5 *公司名称:Microsoft
  6 *命名空间:SAEA.WebAPI.Mvc
  7 *文件名: RouteTable
  8 *版本号: V1.0.0.0
  9 *唯一标识:1ed5d381-d7ce-4ea3-b8b5-c32f581ad49f
 10 *当前的用户域:WENLI-PC
 11 *创建人: yswenli
 12 *电子邮箱:wenguoli_520@qq.com
 13 *创建时间:2018/4/12 10:55:31
 14 *描述:
 15 *
 16 *=====================================================================
 17 *修改标记
 18 *修改时间:2018/4/12 10:55:31
 19 *修改人: yswenli
 20 *版本号: V1.0.0.0
 21 *描述:
 22 *
 23 *****************************************************************************/
 24 using System;
 25 using System.Collections.Generic;
 26 using System.Linq;
 27 using System.Reflection;
 28 using System.Text;
 29 
 30 namespace SAEA.WebAPI.Mvc
 31 {
 32     /// <summary>
 33     /// SAEA.WebAPI路由表
 34     /// </summary>
 35     public static class RouteTable
 36     {
 37         static object _locker = new object();
 38 
 39         static List<Routing> _list = new List<Routing>();
 40 
 41 
 42         /// <summary>
 43         /// 获取routing中的缓存
 44         /// 若不存在则创建
 45         /// </summary>
 46         /// <param name="controllerType"></param>
 47         /// <param name="controllerName"></param>
 48         /// <param name="actionName"></param>
 49         /// <param name="isPost"></param>
 50         /// <returns></returns>
 51         public static Routing TryGet(Type controllerType, string controllerName, string actionName, bool isPost)
 52         {
 53             lock (_locker)
 54             {
 55                 var list = _list.Where(b => b.ControllerName.ToLower() == controllerName.ToLower() && b.ActionName.ToLower() == actionName.ToLower() && b.IsPost == isPost).ToList();
 56 
 57                 if (list == null || list.Count == 0)
 58                 {
 59                     var routing = new Routing()
 60                     {
 61                         ControllerName = controllerName,
 62                         ActionName = actionName,
 63                         IsPost = isPost
 64                     };
 65 
 66                     var actions = controllerType.GetMethods().Where(b => b.Name.ToLower() == actionName.ToLower()).ToList();
 67 
 68                     if (actions == null || actions.Count == 0)
 69                     {
 70                         throw new Exception($"{controllerName}/{actionName}找不到此action!");
 71                     }
 72                     else if (actions.Count > 2)
 73                     {
 74                         throw new Exception($"{controllerName}/{actionName}有多个重复的的action!");
 75                     }
 76                     else
 77                     {                        
 78                         routing.Instance = System.Activator.CreateInstance(controllerType);
 79 
 80                         //类上面的过滤
 81                         var attrs = controllerType.GetCustomAttributes(true);
 82 
 83                         if (attrs != null)
 84                         {
 85                             var attr = attrs.Where(b => b.GetType().BaseType.Name == "ActionFilterAttribute").FirstOrDefault();
 86 
 87                             routing.Atrr = attr;
 88 
 89                         }
 90                         else
 91                         {
 92                             routing.Atrr = null;
 93                         }
 94 
 95                         routing.Action = actions[0];
 96 
 97                         //action上面的过滤
 98                         if (routing.Atrr == null)
 99                         {
100                             attrs = actions[0].GetCustomAttributes(true);
101 
102                             if (attrs != null)
103                             {
104                                 var attr = attrs.Where(b => b.GetType().BaseType.Name == "ActionFilterAttribute").FirstOrDefault();
105 
106                                 routing.Atrr = attr;
107 
108                             }
109                             else
110                             {
111                                 routing.Atrr = null;
112                             }
113                         }
114                     }
115                     _list.Add(routing);
116                     return routing;
117                 }
118                 else if (list.Count > 1)
119                 {
120                     throw new Exception("500");
121                 }
122                 return list.FirstOrDefault();
123             }
124         }
125     }
126 
127 }

8.2怎样传送数据给母版页
http://www.asp.net/learn/mvc/tutorial-13-cs.aspx

  在MVC的思维里面ActionFilterAtrribute的那几个AOP设计也向来伴随左右,比如记日志、黑名单、权限、验证、限流等等效率,所以路由的时候也会缓存那么些。至此一些关键性的地点都早已弄的大约了,为了更好的问询上边说的那一个,上面是vs2017中项指标结构截图:

威尼斯人线上娱乐 9

9.Action过滤器和Model绑定
9.1理解Action过滤器
http://www.asp.net/learn/mvc/tutorial-13-cs.aspx

威尼斯人线上娱乐 10

 

10.运用缓存进步MVC品质

  纯粹干净单码,无别的晦涩内容,假设对mvc有自然了解的,那些大致能够NoNotes,接下去正是按asp.net
mvc命有名的模特式,写个测试webapi看看意况,首先依然测试项目结构图:

 

10.1运用输出缓存提升质量
http://www.asp.net/learn/mvc/tutorial-15-cs.aspx

威尼斯人线上娱乐 11  

       
代码编写成功后,须要开展服务发表了,大家利用汤姆cat作为劳务容器。在IDEA中如何举办汤姆cat配置就不多说了,那里提一下Run/Debug
Configurations。在Application
context中安插成restfulservice才有上边的功力哦。

10.2缓存页上什么翻新动态内容
http://www.asp.net/learn/mvc/tutorial-19-cs.aspx

  HomeController里面按asp.net mvc的习惯来编排代码:

11.MVC安全性
11.1选取Form格局评释
http://www.asp.net/learn/mvc/tutorial-17-cs.aspx
11.2运用Windows格局注明
http://www.asp.net/learn/mvc/tutorial-18-cs.aspx
11.3防止JavaScript注入
http://www.asp.net/learn/mvc/tutorial-06-cs.aspx

  1 /****************************************************************************
  2 *Copyright (c) 2018 Microsoft All Rights Reserved.
  3 *CLR版本: 4.0.30319.42000
  4 *机器名称:WENLI-PC
  5 *公司名称:Microsoft
  6 *命名空间:SAEA.WebAPITest.Controllers
  7 *文件名: HomeController
  8 *版本号: V1.0.0.0
  9 *唯一标识:e00bb57f-e3ee-4efe-a7cf-f23db767c1d0
 10 *当前的用户域:WENLI-PC
 11 *创建人: yswenli
 12 *电子邮箱:wenguoli_520@qq.com
 13 *创建时间:2018/4/10 16:43:26
 14 *描述:
 15 *
 16 *=====================================================================
 17 *修改标记
 18 *修改时间:2018/4/10 16:43:26
 19 *修改人: yswenli
 20 *版本号: V1.0.0.0
 21 *描述:
 22 *
 23 *****************************************************************************/
 24 using SAEA.WebAPI.Mvc;
 25 using SAEA.WebAPITest.Attrubutes;
 26 using SAEA.WebAPITest.Model;
 27 
 28 namespace SAEA.WebAPITest.Controllers
 29 {
 30     /// <summary>
 31     /// 测试实例代码
 32     /// </summary>
 33     //[LogAtrribute]
 34     public class HomeController : Controller
 35     {
 36         /// <summary>
 37         /// 日志拦截
 38         /// 内容输出
 39         /// </summary>
 40         /// <returns></returns>
 41         //[Log2Atrribute]
 42         public ActionResult Index()
 43         {
 44             return Content("Hello,I'm SAEA.WebAPI!");
 45         }
 46         /// <summary>
 47         /// 支持基本类型参数
 48         /// json序列化
 49         /// </summary>
 50         /// <param name="id"></param>
 51         /// <returns></returns>
 52         public ActionResult Get(int id)
 53         {
 54             return Json(new { Name = "yswenli", Sex = "男" });
 55         }
 56         /// <summary>
 57         /// 底层对象调用
 58         /// </summary>
 59         /// <returns></returns>
 60         public ActionResult Show()
 61         {
 62             var response = HttpContext.Response;
 63 
 64             response.Content_Type = "text/html; charset=utf-8";
 65 
 66             response.Write("<h3>测试一下那个response对象使用情况!</h3>参考消息网4月12日报道外媒称,法国一架“幻影-2000”战机意外地对本国一家工厂投下了...");
 67 
 68             response.End();
 69 
 70             return Empty();
 71         }
 72 
 73         [HttpGet]
 74         public ActionResult Update(int id)
 75         {
 76             return Content($"HttpGet Update id:{id}");
 77         }
 78         /// <summary>
 79         /// 基本类型参数、实体混合填充
 80         /// </summary>
 81         /// <param name="isFemale"></param>
 82         /// <param name="userInfo"></param>
 83         /// <returns></returns>
 84         [HttpPost]
 85         public ActionResult Update(bool isFemale, UserInfo userInfo = null)
 86         {
 87             return Json(userInfo);
 88         }
 89         [HttpPost]
 90         public ActionResult Test()
 91         {
 92             return Content("httppost test");
 93         }
 94         /// <summary>
 95         /// 文件输出
 96         /// </summary>
 97         /// <returns></returns>
 98         public ActionResult Download()
 99         {
100             return File(HttpContext.Server.MapPath("/Content/Image/c984b2fb80aeca7b15eda8c004f2e0d4.jpg"));
101         }
102     }
103 }

威尼斯人线上娱乐 12

12.MVC如何测试
12.1成立MVC的单元测试
http://www.asp.net/learn/mvc/tutorial-07-cs.aspx

 

 

13.导航
13.1利用SiteMaps完毕站点导航
http://www.asp.net/learn/mvc/tutorial-20-cs.aspx

  扩张3个LogAtrribute打字与印刷一些内容:

 

14.MVC部署
14.1什么样在不一样版本的IIS上安插MVC应用
http://www.asp.net/learn/mvc/tutorial-08-cs.aspx

 1 /****************************************************************************
 2 *Copyright (c) 2018 Microsoft All Rights Reserved.
 3 *CLR版本: 4.0.30319.42000
 4 *机器名称:WENLI-PC
 5 *公司名称:Microsoft
 6 *命名空间:SAEA.WebAPITest.Common
 7 *文件名: LogAtrribute
 8 *版本号: V1.0.0.0
 9 *唯一标识:2a261731-b8f6-47de-b2e4-aecf2e0e0c0f
10 *当前的用户域:WENLI-PC
11 *创建人: yswenli
12 *电子邮箱:wenguoli_520@qq.com
13 *创建时间:2018/4/11 13:46:42
14 *描述:
15 *
16 *=====================================================================
17 *修改标记
18 *修改时间:2018/4/11 13:46:42
19 *修改人: yswenli
20 *版本号: V1.0.0.0
21 *描述:
22 *
23 *****************************************************************************/
24 using SAEA.Commom;
25 using SAEA.WebAPI.Http;
26 using SAEA.WebAPI.Mvc;
27 
28 namespace SAEA.WebAPITest.Attrubutes
29 {
30     public class LogAtrribute : ActionFilterAttribute
31     {
32         /// <summary>
33         /// 执行前
34         /// </summary>
35         /// <param name="httpContext"></param>
36         /// <returns>返回值true为继续,false为终止</returns>
37         public override bool OnActionExecuting(HttpContext httpContext)
38         {
39             return true;
40         }
41 
42         /// <summary>
43         /// 执行后
44         /// </summary>
45         /// <param name="httpContext"></param>
46         /// <param name="result"></param>
47         public override void OnActionExecuted(HttpContext httpContext, ActionResult result)
48         {
49             ConsoleHelper.WriteLine($"请求地址:{httpContext.Request.Query},回复内容:{result.Content}");
50         }
51     }
52 }

       

15.总结演习–联系人音信保管种类
15.1创制基本CRUD应用
http://www.asp.net/learn/mvc/tutorial-26-cs.aspx

  program.cs Main中运转一下劳务:

  有时候二个观点令人听君一席话胜读十年书、听君一席话胜读十年书。“约定优于配备”就是如此的见识。多谢教给笔者那一个观点的人,王某连云香港人。威尼斯人线上娱乐 13 

15.2怎么让系统变得更雅观
http://www.asp.net/learn/mvc/tutorial-27-cs.aspx

1 MvcApplication mvcApplication = new MvcApplication();
2 
3 mvcApplication.Start();

 

15.3添加表单验证
http://www.asp.net/learn/mvc/tutorial-28-cs.aspx

  最后F5跑起来看看效果:

源点王Angel

15.4让系统达成松耦合
http://www.asp.net/learn/mvc/tutorial-29-cs.aspx

威尼斯人线上娱乐 14

15.5开立单元测试
http://www.asp.net/learn/mvc/tutorial-30-cs.aspx

  使用Apache ab.exe压测一下特性如何:

15.6测试驱动开发(TDD)
威尼斯人线上娱乐 ,http://www.asp.net/learn/mvc/tutorial-31-cs.aspx

威尼斯人线上娱乐 15

15.6添加Ajax功能
http://www.asp.net/learn/mvc/tutorial-32-cs.aspx

 

  至此,1个简练、高效的WebApi就从头实现了!

 

 

转载请标明本文来源:
越多内容欢迎star小编的github:
比方发现本文有哪些难点和任何提出,也随时欢迎交流~

 


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图