ASP.NET 5
在路组织及举行了颇充分之变动,我们原先熟悉的目录结构及类型文件内容都未极端一致了,本篇文章带大家探听
ASP.NET 5 到底和原先有什么样不雷同的地方。
俺们先用 Visual Studio 2015 建立一个簇新的 ASP.NET 5 网站项目,打开VS2015,创建Web项目,.net framework 选择.net 4.5 以上,选择ASP.NET Web Application,在弹出的窗口里选ASP.NET 5 Website模板创建项目,图示如下:
创办好路后,并参考下图打开项目的大街小巷文件夹,解决方案目录结构:
骨子里文件夹的目结构,我们看看出几乎单文件夹,下面我们开展逐一介绍
global.json
全局配置文件:这个文件一般都跟项目解决方案在同等层文件夹下,用来给解决方案参考用之。主要用来定义要「自动导入」到解决方案文件中之路线列表与
sdk 的默认版本。如下图的 “projects” 参数就产生列有设定的会导入入 src
与 test
文件夹下拥有的种。举例来说,如果你想以其余一个缓解方案目录下之之一一个
ASP.NET 5 项目搬迁到目前项目下,只要将该项目目录 ( src\projectName
) 直接倒到当下方案的 src\ 目录下即可,其他甚都毫不安装!
随即我们进入 ASPNET5WebApp 项目文件夹
(如下图),项目的目录结构吧跟之前差别甚酷啊,我平由臻到下独家介绍一通:
Compiler文件夹:ASP.NET MVC 6 ( 等同于 ASP.NET 5 ) 开始,将支撑 Razor 预先编译功能,可以叫你以布局网站时事先编译所有 Razor页面,以提升网站实行的速度。在这文件夹着生出只Compiler\Preprocess\RazorPreCompilation.cs文本,可以给您设置是否如启用 Razor 自动编译功能。(只要取消注释掉的程序代码就足以启用 Razor 预先编译机制)
Controllers文本夹:这个是 ASP.NET MVC 6 的 Controllers 专用文件夹。
gulpfile.json文件:这是 gulp
前端流程管理工具专用的配备文件,可以扶持您得有自动化的干活。这文件及 ASP.NET 5 没有直接关系,相关文书要参考这里:https://github.com/gulpjs/gulp/blob/master/docs/getting-started.md
MessageServices.cs文本:这个文件是当你当 ASP.NET Identity 启用二级验证 (two-factor authentication)
时,让您勾勒发送 Email 或 SMS 短信程序代码的地方。
package.json 文件:这是 nodejs
的 npm
工具专用的部署文件,与 ASP.NET 5 没有直接涉及,相关文书要参见这里:https://docs.npmjs.com/
project.json文件:这个文件是重点的 ASP.NET 5 项目配置文件,许多关键的设定都打 web.config 改到之档案来了,如果只要描写好 ASP.NET 5 势必得入木三分摸底 project.json 文件的布方式,详细文件要参见:https://github.com/aspnet/Home/wiki/Project.json-file
project.lock.json文件:由于当 project.json 文件中会定义项目用加载的 NuGet 套件,而且 Visual Studio 2015 也会活动加载套件的依套件,因此老是项目人事档案在新的环境构建时,很有或会见花费上 3 ~ 5 倍增的辰开展回复套件 (Package Restore),这个 project.lock.json 文件于像是先的 packages.config 文件,明确列出所有需要加载的 NuGet 套件有哪些。这个文件是出于 Visual Studio 2015 自动生成的,但建议在版本控制,以缩短 CI 构建的年月。
本文概要的牵线 ASP.NET 5 全新的品类目录结构与 xproj 项目文件,以及部分杀关键之公文,都是索要专门额外学习之一些,博客园的”汤姆大叔”通过翻阅微软的源码以及网络达到之有的章于大家整理了一个多元入门教程。且其中的代码都于VS 2015 RC中进行过证实。作者为也这些文章建立了一个目录
http://www.cnblogs.com/TomXu/p/4496545.html ,这个系列文章我呢于微信公众号opendotnet 上转载了,欢迎关注微信公众号opendotnet,通过历史信息看:
ASP.NET 5简介
新认识路
种揭示和部署
核心技术与环境布置
Configuration配置信息保管
Middleware详解
因注入
Session与Caching
日志框架
Controller与Action
Routing路由
基于Lamda表达式的强类型Routing实现
TagHelper
View
Component
MvcOptions配置
从定义View视图文件查找逻辑
MVC中之另外新特点
当今,因为种种因素,你必须对一个央或措施开展频率上之访限制。
据,
你对外提供了一个API接口,注册用户每秒钟最多可调用100糟糕,非注册用户每秒钟最多足调用10涂鸦。
按照,
有一个颇吃服务器资源的计,在一如既往时刻不可知跨越10私家调用这个措施,否则服务器满载。
仍, 有局部奇异的页面,访客并无能够屡屡之造访还是发言。
以, 秒杀活动等展开。
论
,防范DDOS,当及一定频率后调用脚本iis服务器ip黑名单,防火墙黑名单。
万一齐种的比喻,也就是说,如何从一个断面的角度对调用的计开展频率上的克。而针对性效率限制,服务器层面都生极致直白的化解措施,现在自己说之虽是代码层面上的频率管控。
正文为闹点儿个示范,一个是基于单机环境之兑现,第二只则是冲分布式的Redis实现。
因为率先单API接口需求吗条例,先说生单机环境下的贯彻。
遵惯性思维,我们当然会想到缓存的逾期策略这种办法,但是严格来讲就是HttpRuntime.Cache而言,通过缓存的过策略来对要进行频率的出现控制是不合适的。
HttpRuntime.Cache
是应用程序级别之Asp.Net的缓存技术,通过这个技能好说明多只缓存对象,可以吗每个对象设置过时,当过时刻到达晚该缓存对象就是会见没有(也即是当您看该对象的当儿也Null)
为什么如此说啊?比如针对某个方法(方法名:GetUserList)我们若开展1秒钟最多10不善的限制,现在咱们尽管新建一个int型的Cache对象,然后设置1秒钟后过消失。那么以访问GetUserList方法前,我们便先判断这Cache对象的价是否超越10,如果超过10即不执行GetUserList方法,如果低于10尽管允许实施。每当访问该对象的时节要未在或者过就新建,这样循环,则该目标永远不可能逾10。
1 if ((int)HttpRuntime.Cache["GetUserListNum"] > 10) //大于10请求失败
2 {
3 Console.WriteLine("禁止请求");
4 }
5 else
6 {
7 HttpRuntime.Cache["GetUserListNum"] = (int)HttpRuntime.Cache["GetUserListNum"] + 1; //否则该缓存对象的值+1
8 Console.WriteLine("允许请求");
9 }
诸如此类的思考以及实现相对来说非常简单,但是依据这样的一个模型设定,那么就会现出这种状况:
设齐图,每个点代表一样不行走访请求,我在0秒的时节
新建了一个名字啊GetUserListNum的缓存对象。
在0~0.5秒中
我访问了3涂鸦,在0.5~1秒内,我们看了7不成。此时,该目标消失,然后我们跟着访问,该对象重置为0.
在第1~1.5秒里,还是看了7软,在第1.5秒~2秒之内做客了3浅。
冲这种简易缓存过期策略的范,在当时2秒钟内,我们虽然平均每秒钟都看了10不好,满足是规定,但是如果我们于中取一个以内段,0.5秒~1.5秒内,也是1秒钟,但是可实实在在的造访了14涂鸦!远远超了我们装的
1秒钟最多看10不成的 限制。
这就是说什么样科学的来解决地方的题材吗?我们可由此模拟对话级别的信号量即时等同招数,这吗便是咱今天之主题了。
什么是信号量?仅就因代码而言, static
SemaphoreSlim semaphoreSlim = new SemaphoreSlim(5);
它的意就是象征于多线程情况下,在其余一样整日,只能以5个线程去访问。
本,在贯彻代码的事先我们事先规划一个型。
假设我们出一个用户A的管道,这个管道里装在用户A的要,比如用户A在一如既往秒钟发出了10破呼吁,那么每一个请求过来,管道里之要素都见面多一个。但是我们设定是管道最多只能容10个因素,而且每个元素的存活期为1秒,1秒后虽说该因素消失。那么这样设计吧,无论是速率还是多少之突进,都见面发出管道长度的限量。这样一来,无论由哪一个时节点还是时间距离出发,这个管道都能满足我们的频率限制需求。
假设这里的管道,就必须跟会话Id来对号入座了。每当发生新会话进来的时段就是很成一个新管道。这个会话id根据自己场景所定,可以是sessionId,可以是ip,也足以是token。
这就是说既是管道是碰头说话级别的,我们定得用一个容器,来装这些管道。现在,我们坐IP来命名会话管道,并把具有的管道还装在一个器皿被,如图
若果据悉刚才底设定,我们尚需对容器内的各国条管道的素进行处理,把过的吃删除掉,为这个,还待单独为该容器开辟有一个线程来吧各个条管道展开元素的清理。而当管道的因素呢0时,我们即便到底掉该管道,以便节省容器空间。
自然,由于用户量基本上,一个容器内或者有上万独管道,这个上偏偏用一个容器来装来清理,在效率达明显是不够的。这个时节,我们就算得对容器进行横向扩张了。
比如,我们得以根据Cpu核心数自动生成对应之数据之容器,然后根据一个算法,对IP来拓展导流。我当下cpu是4只逻辑核心,就不行成了4个容器,每当用户访问的时刻,都见面冠经过一个算法,这个算法会对IP进行处理,如192.168.1.11~192.168.1.13以此Ip段进第一个容器,xxx~xxx进第二只容器,依次类推,相应的,也尽管闹了4个线程去分别处理4个容器被的管道。
那么,最终便形成了咱们的4容器4线程模型了。
现行,着眼于编码实现:
首先我们用一个能够承载这些器皿的载体,这个载体类似于连接池的定义,可以根据部分索要自动生成适应数量的器皿,如果生特殊要求的言辞,还可以以容器上切出一个器皿管理的给,在线程上切出一个线程管理之照以便为实时监察及调度。如果的确使做这样一个网,那么
容器的调度 和 线程的调度功能
是必备的,而本Demo则是得了首要功能,像容器与线程在代码中本身啊绝非退开来,算法为是直接写好的,实际设计中,对算法的规划尚是可怜重大之,还有多线程模型中,怎样上锁才会于效率最大化为是根本的。
万一这里为了案例之直观就直接写很成4只容器。
public static List<Container> ContainerList = new List<Container>(); //容器载体
static Factory()
{
for (int i = 0; i < 4; i++)
{
ContainerList.Add(new Container(i)); //遍历4次 生成4个容器
}
foreach (var item in ContainerList)
{
item.Run(); //开启线程
}
}
而今,我们若 有编号也 0 到 40 这样的 41只用户。那么这个导流算法
我吧就算一直写深,编号0至9底用户
将他们之呼吁被丢转到第一单容器,编号10~19底用户
放到第二独容器,编号20~29推广至第三单容器,编号30~40底用户放第四只容器。
那么这个代码就是这般的:
static Container GetContainer(int userId, out int i) //获取容器的算法
{
if (0 <= userId && userId < 10) //编号0至9的用户 返回第一个容器 依次类推
{
i = 0;
return ContainerList[0];
}
if (10 <= userId && userId < 20)
{
i = 1;
return ContainerList[1];
}
if (20 <= userId && userId < 30)
{
i = 2;
return ContainerList[2];
}
i = 3;
return ContainerList[3];
}
当我们的对话请求经过算法的导流之后,都不能不调用一个方式,用于辨别管道数量。如果管道数量就超过10,则呼吁失败,否则成功
public static void Add(int userId)
{
if (GetContainer(userId, out int i).Add(userId))
Console.WriteLine("容器" + i + " 用户" + userId + " 发起请求");
else
Console.WriteLine("容器" + i + " 用户" + userId + " 被拦截");
}
连着下去便容器Container的代码了。
此处,对容器的选型用线程安全之ConcurrentDictionary类。
线程安全:当多个线程同时读写及一个共享元素的时候,就会现出数错乱,迭代报错等安全问提
ConcurrentDictionary:除了GetOrAdd方法而慎用外,是.Net4.0揽为解决Dictionary线程安全而出之初类型
ReaderWriterLockSlim:较ReaderWriterLock优化的读写锁,多单线程同时做客读锁
或 一个线程访问写锁
private ReaderWriterLockSlim obj = new ReaderWriterLockSlim(); //在每个容器中申明一个读写锁
public ConcurrentDictionary<string, ConcurrentList<DateTime>> dic = new ConcurrentDictionary<string, ConcurrentList<DateTime>>(); //创建该容器 dic
下一场当你向容器上加同条管道被之数额是经此法:
public bool Add(int userId)
{
obj.EnterReadLock();//挂读锁,允许多个线程同时写入该方法
try
{
ConcurrentList<DateTime> dtList = dic.GetOrAdd(userId.ToString(),t=>{ new ConcurrentList<DateTime>()}); //如果不存在就新建 ConcurrentList
return dtList.CounterAdd(10, DateTime.Now); //管道容量10,当临界管道容量后 返回false
}
finally
{
obj.ExitReadLock();
}
}
这里,为了当背后的线程遍历删除ConcurrentList的管道的时光保证ConcurrentList的安全性,所以这里设加读锁。
而ConcurrentList,因为.Net没有出List集合类的线程安全(此间我说明下:之所以不用ConcurrentBag是因只要保证count和add的一致性,这里补充一下),所以自己新建了一个蝉联给List<T>的平安种,在此间
封装了3独需要采用的办法。
public class ConcurrentList<T> : List<T>
{
private object obj = new object();
public bool CounterAdd(int num, T value)
{
lock (obj)
{
if (base.Count >= num)
return false;
else
base.Add(value);
return true;
}
}
public new bool Remove(T value)
{
lock (obj)
{
base.Remove(value);
return true;
}
}
public new T[] ToArray()
{
lock (obj)
{
return base.ToArray();
}
}
}
最后便是线程的运转方式:
public void Run()
{
ThreadPool.QueueUserWorkItem(c =>
{
while (true)
{
if (dic.Count > 0)
{
foreach (var item in dic.ToArray())
{
ConcurrentList<DateTime> list = item.Value;
foreach (DateTime dt in list.ToArray())
{
if (DateTime.Now.AddSeconds(-3) > dt)
{
list.Remove(dt);
Console.WriteLine("容器" + seat + " 已删除用户" + item.Key + "管道中的一条数据");
}
}
if (list.Count == 0)
{
obj.EnterWriteLock();
try
{
if (list.Count == 0)
{
if (dic.TryRemove(item.Key, out ConcurrentList<DateTime> i))
{ Console.WriteLine("容器" + seat + " 已清除用户" + item.Key + "的List管道"); }
}
}
finally
{
obj.ExitWriteLock();
}
}
}
}
else
{
Thread.Sleep(100);
}
}
}
);
}
终极,是法力图,一个是根据控制台的,还一个凡是依据Signalr的。
点介绍了同等种频率限制的范,分布式与单机相比,无非就是是载体不同,我们设把这个容器的载体从程序上移植出来,来弄成一个独门的劳务或者直接借用Redis也是实用之。
这边虽介绍分布式情况下,Redis的落实。
不等于Asp.Net的多线程模型,大概因为Redis的各种类型的素非常粒度的操作造成各种加锁之纷繁,所以当网要处理这块Redis是单线程的,基于Redis的贯彻则坐单线程的故在编码角度不用太多着想到和逻辑无关的题材。
简单介绍下,Redis是一个内存数据库,这个数据库属于非关系型数据库,它的概念不同让一般的我们体会的Mysql澳门新葡亰官网
Oracle
SqlServer关系型数据库,它并未Sql没有字段名没有表名这些概念,它和HttpRunTime.Cache的概念差不多一样,首先由操作上属于键值对模式,就使
Cache[“键名”]
这样就算会得到到价值类似,而且可针对每个Key设置过策略,而Redis中的Key所对应之值并无是怀念存啥就存啥的,它支持五种多少列:string(字符串),hash(哈希),list(列表),set(集合)及sorted
set(有序聚集)。
今日如果说之是Sorted
set有序聚集,有序聚集相比另的集聚类型的特别点在,使用有序聚集的时候还能吃插入的要素指定一个
积分score,我们将这个积分score理解啊破除序列,它里面会对积分进行排序,积分允许再,而有序聚集中之要素虽然是绝无仅有。
还是一样的思绪,每当发生用户访问的时候,都指向拖欠用户之
管道(有序聚集)中补充加一个因素,然后设置该因素的积分也当下光阴。接着在程序中开始个线程,来对管道被积分小于约定时间的因素进行清理。因为规定有序聚集中之元素只能是唯一值,所以当赋值方面只要是满足uuid即可。
那么因此Redis来兑现之代码那就算是类似这种:
透过using语法糖实现IDisposable而包的Redis分布式锁,然后中间正常的逻辑判断。
然的代码虽然为能够形成功能,但切莫敷自己。Redis是只依据内存的数据库,于性能而言,瓶颈在于网络
IO 上,与Get一不成发生同样次于呼吁相比,能无克经过一样段脚本来实现多数逻辑吗?
有的,Redis支持 Lua脚本:
Lua
是如出一辙种轻量小巧的脚本语言,用专业C语言编写并因为自代码形式开放,
其设计目的是为了放置应用程序中,从而为应用程序提供灵活的扩展和定制功能。
大致意思就是是,直接通往Redis发送一截脚本或者受它一直本地读取一段脚本从而直接实现有的逻辑。
/// <summary>
/// 如果 大于10(AccountNum) 就返回1 否则就增加一条集合中的元素 并返回 空
/// </summary>
/// <param name="zcardKey"></param>
/// <param name="score"></param>
/// <param name="zcardValue"></param>
/// <param name="AccountNum"></param>
/// <returns></returns>
public string LuaAddAccoundSorted(string zcardKey, double score, string zcardValue, int AccountNum)
{
string str = "local uu = redis.call('zcard',@zcardKey) if (uu >=tonumber(@AccountNum)) then return 1 else redis.call('zadd',@zcardKey,@score,@zcardValue) end";
var re = _instance.GetDatabase(_num).ScriptEvaluate(LuaScript.Prepare(str), new { zcardKey = zcardKey, score = score, zcardValue = zcardValue, AccountNum=AccountNum });
return re.ToString();
}
local
uu就是表明一个啊名uu的变量的意思,redis.call就是redis命令,这段脚本意思就是是一旦
大于10(AccountNum) 就返回1 否则就是加一长集合中之元素 并回到 空。
管道内元素处理的法门就是:
/// <summary>
/// 遍历当前所有前缀的有序集合,如果数量为0,那么就返回1 否则 就删除 满足最大分值条件区间的元素,如果该集合个数为0则消失
/// </summary>
/// <param name="zcardPrefix"></param>
/// <param name="score"></param>
/// <returns></returns>
public string LuaForeachRemove(string zcardPrefix, double score)
{
StringBuilder str = new StringBuilder();
str.Append("local uu = redis.call('keys',@zcardPrefix) "); //声明一个变量 去获取 模糊查询的结果集合
str.Append("if(#uu==0) then"); //如果集合长度=0
str.Append(" return 1 ");
str.Append("else ");
str.Append(" for i=1,#uu do "); //遍历
str.Append(" redis.call('ZREMRANGEBYSCORE',uu[i],0,@score) "); //删除从0 到 该score 积分区间的元素
str.Append(" if(redis.call('zcard',uu[i])==0) then "); //如果管道长度=0
str.Append(" redis.call('del',uu[i]) "); //删除
str.Append(" end ");
str.Append(" end ");
str.Append("end ");
var re = _instance.GetDatabase(_num).ScriptEvaluate(LuaScript.Prepare(str.ToString()), new { zcardPrefix = zcardPrefix + "*", score = score });
return re.ToString();
立马2段落代码通过发送Lua脚本的款型来形成了全部过程,因为Redis的网络型原因,所以管LuaForeachRemove方法为取出来开只服务来单独处理即可。至于那种多容器多线程的实现,则一心可初步多只Redis的实例来实现。最后放上效果图。
最终,我将这些都受做成了个Demo。但是没找到合适的上传网盘,所以大家可以留邮箱(留了便作),或者直接加QQ群文件自取,讨论交流:166843154
本身爱好跟本身同样的口交朋友,不吃环境影响,自己是投机之师资,欢迎加群
.Net web交流群, QQ群:166843154 欲望与挣扎
作者:小曾
出处:http://www.cnblogs.com/1996V/p/8127576.html 欢迎转载,但任何转载必须保留完整文章及博客园出处,在显要地方显示署名以及原文链接。
.Net交流群, QQ群:166843154 欲望与挣扎
ASP.NET 5
在项目组织及开了要命可怜的转移,我们以前熟悉的目结构以及类型文件内容还不绝雷同了,本篇文章带大家探听
ASP.NET 5 到底和以前来什么样不一致的地方。
俺们先行用 Visual Studio 2015 建立一个全新的 ASP.NET 5 网站项目,打开VS2015,创建Web项目,.net framework 选择.net 4.5 以上,选择ASP.NET Web Application,在弹出的窗口里选择ASP.NET 5 Website模板创建项目,图示如下:
缔造好路后,并参考下图打开项目的八方文件夹,解决方案目录结构:
其实文件夹的目结构,我们视有几乎独文本夹,下面我们开展逐一介绍
global.json
全局配置文件:这个文件一般都跟项目解决方案在同等层文件夹下,用来叫解决方案参考用之。主要用来定义要「自动导入」到解决方案文件中的路线列表与
sdk 的默认版本。如下图的 “projects” 参数就发出列有设定的会导入入 src
与 test
文件夹下具有的路。举例来说,如果你想以其他一个缓解方案目录下之某个一个
ASP.NET 5 项目搬迁到眼前色下,只要将该品种目录 ( src\projectName
) 直接倒到当下方案的 src\ 目录下即可,其他甚都休想安装!
随后我们进入 ASPNET5WebApp 项目文件夹
(如下图),项目的目录结构吧跟之前差别非常充分啊,我同样由臻到下独家介绍一全方位:
Compiler文件夹:ASP.NET MVC 6 ( 等同于 ASP.NET 5 ) 开始,将支持 Razor 预先编译功能,可以吃您以布局网站时事先编译所有 Razor页面,以提升网站实施之快慢。在斯文件夹着生只Compiler\Preprocess\RazorPreCompilation.cs文本,可以让你设置是否如启用 Razor 自动编译功能。(只要取消注释掉的程序代码就好启用 Razor 预先编译机制)
Controllers文件夹:这个是 ASP.NET MVC 6 的 Controllers 专用文件夹。
gulpfile.json文件:这是 gulp
前端流程管理工具专用的布局文件,可以帮忙您完了有自动化的行事。这文件和 ASP.NET 5 没有一直关联,相关文书要参考这里:https://github.com/gulpjs/gulp/blob/master/docs/getting-started.md
MessageServices.cs文本:这个文件是当你在 ASP.NET Identity 启用二流验证 (two-factor authentication)
时,让你写发送 Email 或 SMS 短信程序代码的地方。
package.json 文件:这是 nodejs
的 npm
工具专用的布文件,与 ASP.NET 5 没有一直关系,相关文件要参见这里:https://docs.npmjs.com/
project.json文本:这个文件是第一的 ASP.NET 5 项目配置文件,许多生死攸关之设定都于 web.config 改到这个档案来了,如果要是描绘好 ASP.NET 5 势必得深入摸底 project.json 文件的部署方式,详细文件要参考:https://github.com/aspnet/Home/wiki/Project.json-file
project.lock.json文本:由于在 project.json 文件里会定义项目要加载的 NuGet 套件,而且 Visual Studio 2015 也会见自行加载套件的指套件,因此老是项目在初的条件构建时,很有或会见花费上 3 ~ 5 加倍的流年展开复原套件 (Package Restore),这个 project.lock.json 文件于像是原先的 packages.config 文件,明确列出所有需要加载的 NuGet 套件有怎么样。这个文件是由于 Visual Studio 2015 自动生成的,但建议在版本控制,以缩短 CI 构建的时空。
正文概要的介绍 ASP.NET 5 全新的种目录结构以及 xproj 项目文件,以及有好重要的文书,都是用专门额外学习的一对,博客园的”汤姆大叔”通过看微软的源码以及台网直达的组成部分篇章于大家整理了一个多元入门教程。且其中的代码都当VS 2015 RC中开展了证实。作者也也这些文章建立了一个目录
http://www.cnblogs.com/TomXu/p/4496545.html ,这个系列文章我哉以微信公众号opendotnet 上转载了,欢迎关注微信公众号opendotnet,通过历史信息看:
ASP.NET 5简介
乍识路澳门新葡亰网址
色揭示暨配置
核心技术与环境布置
Configuration配置信息保管
Middleware详解
仰注入
Session与Caching
日志框架
Controller与Action
Routing路由
基于Lamda表达式的强类型Routing实现
TagHelper
View
Component
MvcOptions配置
自定义View视图文件查找逻辑
MVC中之别新特征
【转】你知道C#面临的Lambda表达式的演化过程吗?
那得从十分悠久很久以前说从了,记得很时候…
稀里糊涂的记从前生个让委托的事物是那么的胜深难理解。
例一:
嗬是信托?
个体掌握:所以来传递方式的种类。(因此来传递数字的品类有int、float、double,用来传递方式的就是来嘱托)
例二:
并且通过了老大遥远很久…
过剩时分委托接收的章程是一次性的或者方法体是非常简单的…
例三:
咱们好形容成:
发生没出察觉我们每次都要定义委托,很多上签名可能是相同的。这样便从来不必要定义再度的。
然后还要过了怪悠久很久…
唯恐非常也认为我们每次定义委托有接触痴,所以索性在框架内一样软定义好有可能就此到的信托。那变幻的方签名怎么可能定义得咸?没关系,定义成泛型的莫就是可了也。
先说Func:
细之心上人或者看到了,Func相对于AddDelegate多定义了一个int。多出了底坏是乘的凡归路。我们F12扣对应之概念:
至于地方Func的写法我们好简写成:(语法糖而已,编译后抑注释的代码)
再看Action:
提示:以后如我们形容代码的下如果写到到delegate…,你要是立马想到是否好为此Func或者Action来取代吗?C#4蒙的Action和Func有16只参数,足够你用了。
咱俩当了以等,又过了好久好久…
自家XX,这TM就是亲自兄弟啊。直接去丢delegate关键字,然后加一个=>就成为了lambda表达式了。(=>读作goes to)
咱继承简化:
丢掉参数类型为是可的,因为强大的VS可以依据泛型委托Func自己想出来参数类型。
尚得简化为?当然:
return关键字为决不了,大括哀号也决不了。(当然,方法体只生单纯条告句才能够怎么开)
现在扣起就不行接近我们平素于是底Lambda表达式了。
要传入参数就来一个吧,我们还好继承简化:
立就是咱平常呈现得极其多的lambda长相了。
一旦长大这样吗是产生求的:
至于第1点,lambda我们平常所以得比多之是冲IEnumerable或IQueryable,所以不得不发出一个参数为便满足了。
有关第2点,我们利用扩展方法的链式编程来解决。
如:(用链式来化解第二碰)
事后,我们了上了福之生活…
借《深入理解C#》中之等同图:
小知识:(异步Lambda)
Func<Student, Task<bool>> func = async t =>
{
await Task.Delay(100);//等待100毫秒
return false;
};
结束:
本文简短的说了下lambda表达式在C#屡遭的一步步演化。说之未必然对,轻拍!
本文为同到《C#基础知识巩固系列》
mysql+ef的配备相较mssql+ef来说复杂一些。我之感想就安排难度在插件版本造成的各种不兼容问题。另外参考了累累博客,将多单博客里的经验综合才得以兑现,因为无是每个人的操作都与那些博客作者描述的情景一致,不过解决以后外还吓说。现在从零开始操作mysql+CodeFirst的兑现,总结自身的部署过程。先保证安装并打开了mysql数据库:
1.新建控制台项目
2.在程序包管理器控制台里依次安装(注意:EF版本一定要是没有,另外第②以及第③确保版本一样,因为③和②发依靠关系,版本不平等会导致有些题材)
①Install-Package EntityFramework -Version
6.1.3
②Install-Package MySql.Data -Version
6.8.8
③Install-Package MySql.Data.Entity
-Version 6.8.8
3.App.Config配置文件里丰富:
<connectionStrings>
<add name="connStr" connectionString="data source=127.0.0.1;user
id=root;password=123456;database=sqltest;" providerName="MySql.Data.MySqlClient" />
</connectionStrings>
4.一一新建Person实体类,PersonConfig类,详细代码:
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
class PersonConfig : EntityTypeConfiguration<Person>
{
public PersonConfig()
{
this.ToTable("T_Persons");
}
}
5.新建MyContext类,详细代码(注意:如果不在相近上方做DBConfigurationType标记的话语会于最终操作update-database时错,别忘):
[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
class MyContext : DbContext
{
public MyContext()
: base("name=connStr")//name对应配置文件里的连接字符串name属性
{
}
public DbSet<Person> Persons { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());
}
}
6.继续在程序包管理器控制高运行命令Enable-Migrations
-force,成功后用会见冒出如图所示信息:
注意:此时以列澳门新葡亰官网下会自动生成文件夹和一个类,如图所示:
7.开辟Configuration.cs,将AutomaticMigrationsEnabled的价修改也true,并且于先后包管理器控制高运行命令update-database
-force,成功后用会见现出如图所示信息:
只顾:没当MyContext类上方标记DBConfigurationType害得自己立刻同步浪费了一点只钟头,会提醒No
MigrationSqlGenerator found for provider ‘MySql.Data.MySqlClient’. Use
the SetSqlGenerator method in the target migrations configuration class
to register additional SQL generators.
8.现在来测试效果。目前mysql里无名字让sqltest的数据库是,CodeFirst是透过代码来动生成数据库的。主函数代码如下:
using (MyContext ctx = new MyContext())
{
Person per1 = new Person { Name = "per1", Age = 12 };
Person per2 = new Person { Name = "per2", Age = 17 };
Person per3 = new Person { Name = "per3", Age = 19 };
ctx.Persons.Add(per1);
ctx.Persons.Add(per2);
ctx.Persons.Add(per3);
ctx.SaveChanges();
Console.WriteLine("添加成功");
}
Console.ReadKey();
9.运转后只要成功,刷新Navicat for
MySQL的数据库列表可以窥见新变化的数据库:
留意:①自动生成了__migrationhistory表说明配置非常成功。②PersonConfig.cs里之this.ToTable(“T_Persons”);影响实体类映射成功后底表名。③默认Id字段为主键并且自增,因此不需要手动为Id属性赋值。
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的技能堆栈,如下图所示:
此图的义是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应用程序,摆脱复杂的限制。
参考资料:《精通ASP.NET MVC X》
ASP.NET 5
在路组织及召开了老非常之变更,我们以前熟悉的目结构以及品种文件内容还不顶雷同了,本篇文章带大家探听
ASP.NET 5 到底和原先发怎样不均等的地方。
咱们先行用 Visual Studio 2015 建立一个簇新的 ASP.NET 5 网站项目,打开VS2015,创建Web项目,.net framework 选择.net 4.5 以上,选择ASP.NET Web Application,在弹出的窗口里挑选ASP.NET 5 Website模板创建项目,图示如下:
创立好项目后,并参照下图打开项目之四处文件夹,解决方案目录结构:
事实上文件夹的目录结构,我们视出几独公文夹,下面我们开展逐一介绍
global.json
全局配置文件:这个文件一般都和项目解决方案在同样层文件夹下,用来深受解决方案参考用底。主要用以定义要「自动导入」到解决方案文件被之路列表与
sdk 的默认版本。如下图的 “projects” 参数就产生列有设定的会导入入 src
与 test
文件夹下具有的品种。举例来说,如果你想拿其它一个化解方案目录下的有一个
ASP.NET 5 项目搬迁到手上型下,只要以欠类型目录 ( src\projectName
) 直接倒到当下方案的 src\ 目录下即可,其他什么都不用安装!
随着我们登 ASPNET5WebApp 项目文件夹
(如下图),项目的目录结构吧跟之前差别很特别哦,我平由达到及下各自介绍一百分之百:
Compiler文件夹:ASP.NET MVC 6 ( 等同于 ASP.NET 5 ) 开始,将支持 Razor 预先编译功能,可以让您于布局网站经常优先编译所有 Razor页面,以提升网站实施之速度。在这个文件夹着生只Compiler\Preprocess\RazorPreCompilation.cs文件,可以被你设置是否要启用 Razor 自动编译功能。(只要取消注释掉的程序代码就足以启用 Razor 预先编译机制)
Controllers文本夹:这个是 ASP.NET MVC 6 的 Controllers 专用文件夹。
gulpfile.json文件:这是 gulp
前端流程管理工具专用的配备文件,可以扶持您完了有自动化的做事。这文件及 ASP.NET 5 没有一直关乎,相关文书要参见这里:https://github.com/gulpjs/gulp/blob/master/docs/getting-started.md
MessageServices.cs文本:这个文件是当你以 ASP.NET Identity 启用二阶段验证 (two-factor authentication)
时,让您勾勒发送 Email 或 SMS 短信程序代码的地方。
package.json 文件:这是 nodejs
的 npm
工具专用的布置文件,与 ASP.NET 5 没有一直关联,相关文件要参见这里:https://docs.npmjs.com/
project.json文本:这个文件是任重而道远之 ASP.NET 5 项目布局文件,许多重中之重之设定都自 web.config 改到此档案来了,如果要描写好 ASP.NET 5 势必得透彻摸底 project.json 文件之安排方式,详细文件要参见:https://github.com/aspnet/Home/wiki/Project.json-file
project.lock.json文本:由于当 project.json 文件中会定义项目要加载的 NuGet 套件,而且 Visual Studio 2015 也会见自动加载套件的指套件,因此老是项目于初的条件构建时,很有或会见花费上 3 ~ 5 倍增的时光进行恢复套件 (Package Restore),这个 project.lock.json 文件于像是先的 packages.config 文件,明确列出所有需要加载的 NuGet 套件有什么。这个文件是出于 Visual Studio 2015 自动生成的,但建议在版本控制,以缩短 CI 构建的辰。
正文概要的介绍 ASP.NET 5 全新的路目录结构以及 xproj 项目文件,以及有十分重要的文书,都是用专门额外学习的一对,博客园的”汤姆大叔”通过看微软的源码以及台网直达的组成部分篇章于大家整理了一个多元入门教程。且其中的代码都当VS 2015 RC中展开了证实。作者也也这些文章建立了一个目录
http://www.cnblogs.com/TomXu/p/4496545.html ,这个系列文章我也以微信公众号opendotnet 上转载了,欢迎关注微信公众号opendotnet,通过历史信息看:
ASP.NET 5简介
乍认识路
色揭示暨配置
核心技术与环境布置
Configuration配置信息保管
Middleware详解
仰注入
Session与Caching
日记框架
Controller与Action
Routing路由
基于Lamda表达式的强类型Routing实现
TagHelper
View
Component
MvcOptions配置
自定义View视图文件查找逻辑档案馆
MVC中的别样新特征
【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
本篇文章就是无发话架构,但是Cache又是搭中必备的有些,因此,在执教Cache的又,将会见提及到部分架构知识,关于架构部分,读者可不要理解,或者直接跳过,
卿独自待关注Cache即可,具体的架,会当继承文章中以及大家大快朵颐。
一样 为什么而于ASP.NET
项目被引入缓存
下图为正规的处理思路以及艺术
2.为什么引入Cache呢?
我们解,造成高并发的根本原因是大方读写的题材,一般地,对于一个网,读总是比写多,如我辈总是逛淘宝,京东,天猫,唯品会等,但我们并不一定买东西(买东西,即下单,下单的操作,对承诺DB的Write操作),缓存主要解决读之题目(当然,在晚期的稿子中,我会讲到信息队列MQ,也是平等种植缓存机制,其不仅解决读之问题,还解决写的题材)。
很好,我们解缓存主要解决读的题目,那么,我们念之东西很多,是休是缓存所有读的内容呢?答案是否定的。缓存主要解决那些频繁访问,吃服务器资源,实时性要求于没有,不常更新的内容。
老二 ASP.NET
缓存技术概述
(一)ASP.NET缓存技术类
以ASP.NET实际项目开中,我们可使基本的老三种缓存技术:页面缓存、局部页面及数目缓存
1.整页缓存
所谓整页缓存,指缓存整个页面,且设置刷新间隔时间,刷新间隔时间一般以秒为单位(缓存不可知整个刷新,且刷新间隔不借助外部事件);
2.组成部分页面缓存
所谓部分页面缓存,也吃局部页面缓存,指经设定影响页面的参数,此时的缓存存储页面的大都独版,一般景象用按照参数值为这些页面版本设置索引;
3.用程序缓存
所谓用程序缓存,也吃数据缓存,指将用大量服务器资源的靶子存储于内存中,在ASP.NET中,由Cache类来促成(Cache类的每个实例对承诺切切实实的每个运用程序,
那生存期依赖让下程序的生存期,当然,如果系统重新开或者断电,则其它当别论。)
(二)二级缓存技术
当ASP.NET一般的花色被,我们采取二级缓存就可缓解服务器缓存问题了,如下为二级缓存的轮廓图。
1.何也一级缓存?
一级缓存,指非借助外部缓存的缓存,上图被之二级缓存去丢外部缓存部分即使为一级缓存;
2.做:由Web服务器、数据库服务器和二级缓存系统结合;
3.请求-处理流程:对于读数据,采用由内为他之逐条:内部缓存=》外部缓存=》数据库
(1)首涂鸦呼吁读数据:蓝色之箭头表示首不成呼吁,从数据库服务器DB中取得数据,并以数据缓存在二级缓存系统受;
(2)非首浅呼吁读数据:先打二级缓存内部缓存中取数据展示页面,如果没数量,则失去二级缓存外部缓存中取数据展示页面,若外部缓存中从不数据,则另行失去数据库服务器中取数据;
(4)对于刻画多少,才出从外向内顺序:数据库=》外部缓存=》内部缓存(这样做的目的,主要是保障数据的一致性);
4.做二级缓存系统的标缓存系统,一般我们可挑选MongoDB,Redis,Mencached等;
5.基被SOA+Redis的之形似系统架构(当然,本篇文章不提架构,因此无会见分析架构,但会在继续的文章被单独教架构)
6.如何保证数据的一致性?
对于读数据,采用自内往他的一一;对于刻画多少,采用从外向内的各个;
7.缓存的有效期?
我们因为Memcached做表面缓存为例,对于ASP.NET内部缓存,我们见面担心内存不够用,而对此Memcached,则可以不要顾虑内存不够用的题材。
采用二级缓存方案,Memcaches缓存与ASP.NET缓存还如进行严格的管住以及控制,因为Memcached工作以外围,直接指向数据库中之数码开展读取,
都他的内存空间一般比充分,故她的缓存数据有效期应该依据缓存数据在采取中的实际缓存有效期来设定,不会见惨遭中不足使为放走的熏陶,而ASP.NET
缓存工作于内层,直接与利用程序中之数据开展互动,且ASP.NET框架对自缓存的内存空间有所限制,缓存空间了大会影响整运用的性质,为了当
相同之内存空间下缓存更多的多寡,ASP.NET缓存的有效期应该小于或等Memcached缓存的有效期,有效期具体多长时间视内存空间和运用程序访问
频率的高低而定,ASP.NET对许缓存数据的有效期的与不能够凌驾其当Memcached中之有效期,这样才能够达标缓存数据的一致性,两只缓存的协同工作
,可以本着采用程序的访问速度带啦很十分的升迁。
(三)缓存涉及到的片连锁技能
缓存是同帮派技术,不容许花较少的篇幅即可讲明白,如下简要列举部分Cache相关的技艺
1.Cahe维护
保安网络及的,本地的Cache;
2.路是因为政策
现实的路由策略要依据Cache架构和筹划来设定,大致讲解一下地方缓存路由政策
3.替换算法
略
4.预取技术
略
5.Cache性能分析
借助于一些特性分析工具来分析,主要关心命中率/缓存对象大小之间关系
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中整页缓存的语法格式
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:
(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>操作即可
(3)缓存依赖
预留读者朋友等去研究,比较简单。
(二)部分页面缓存
部分页面缓存,也被页面部分缓存,主要解决在页面缓存中要常实时更新的平部分内容。
页面部分缓存就是缓存页面的同样片段,而不是缓存整个页面,它适用于页面内某些部分或用更新的数目的情形,在常用页面部分缓存的技术下经常应用先用全体页面缓存,然后又交替页面被未欲缓存的有的。(用AJAX局部刷新来明)
(三)运用程序缓存
应用程序缓存是为此来储存和下程序有关的靶子,主要由Cache类来促成(命名空间System.Web.Caching),可以以编码的措施灵活地操纵缓存的操作。
四 版权区
A系统传递数据给B系统
1、A创建asmx推送接口如下
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Services;
using Topevery.DUM.Report;
using Topevery.DUM.Report.Entity;
namespace Topevery.DUM.Report.ASMX
{
/// <summary>
/// PreEventFive 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。
// [System.Web.Script.Services.ScriptService]
public class PreEventFive : System.Web.Services.WebService
{
[WebMethod(Description = "直接返会json")]
public string GetPETable()
{
DateTime now = DateTime.Now;
DateTime d1 = new DateTime(now.Year, now.Month, 1);
//DateTime d1 = Convert.ToDateTime ("2015-01-01");
DateTime d2 = DateTime.Now;
DataTable dt = Broker.GetStatisTypeTop10(d1, d2, 1, "2").Tables[0];
int i = 1;
EventDataList DataSource = new EventDataList();
List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();
foreach (DataRow dr in dt.Rows)
{
if (i < 6)
{
DataSource.SerialNumber.Add(i.ToString());
DataSource.Name.Add(dr["C_NAME"].ToString());
DataSource.LNNUM.Add(dr["C_LA_NUM"].ToString());
}
i++;
}
//数组序列化转为json
string jsonData2Tran = Newtonsoft.Json.JsonConvert.SerializeObject(DataSource);
//Context.Response.Charset = "GB2312"; //设置字符集类型
//Context.Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
//Context.Response.Write(jsonData2Tran);
//Context.Response.End();
return jsonData2Tran;
}
}
}
View Code
2、B引用A接口,接受该服务多少
JNEvent.PreEventFive ef = new JNEvent.PreEventFive();
string pe = ef.GetPETable();
PreEventFive evt = Newtonsoft.Json.JsonConvert.DeserializeObject<PreEventFive>(pe);
View Code
3、发布得小心的凡右击B接口,修改属性-web引用url,将localhost改吗外网IP
4、发布后用以该站点下<system.web>中间配置如下信,开启远程访问
<webServices>
<protocols>
<add name="HttpSoap"/>
<add name="HttpPost"/>
<add name="HttpGet"/>
<add name="Documentation"/>
</protocols>
</webServices>
私或者觉得.asmx比.ashx方便得差不多