标签归档ASP.NET

人事档案认识ASP.NET 5品种结构与类文件xproj

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模板创建项目,图示如下:

人事档案 1

创办好路后,并参考下图打开项目的大街小巷文件夹,解决方案目录结构:

人事档案 2

骨子里文件夹的目结构,我们看看出几乎单文件夹,下面我们开展逐一介绍

人事档案 3

  • .vs 隐藏文件夹:用来保存原本我们以VS2003-2013类型目录中见面见到的
    *.suo 文件,这个文件要用来保存 Visual Studio 2015
    操作过程的一对状态,例如你早就开启之档案列表等临时的信。如果
    ASP.NET 5 网站采取 IISExpress 进行排错,IISExpress 所需要之
    applicationhost.config 配置文件呢会见在 .vs\config\ 目录下。
    这些临时的文本不应有放入到源代码版本控制,这个好不容易一个更上一层楼。
  • artifacts
    文件夹:用来保存网站构建过程中待现保存的元文件案与输出文件,也就算是先前在列面临时常来看的
    bin 与 obj
    目录,现在且统一搬迁至者文件夹下。这个文件夹不应该进入版本控制,这又是千篇一律可怜改善。
  • src
    文件夹:用来放置该方案里之拥有品种,所以要的源代码都见面放于这目录下,该目录下每个目录就是一个独立的门类。
  • *.sln
    项目文件:这个文件就不要介绍了,跟之前我们经常来看的色解决方案是意同的。
  • global.json
    全局配置文件:这个文件一般都跟项目解决方案在同等层文件夹下,用来给解决方案参考用之。主要用来定义要「自动导入」到解决方案文件中之路线列表与
    sdk 的默认版本。如下图的 “projects” 参数就产生列有设定的会导入入 src
    与 test
    文件夹下拥有的种。举例来说,如果你想以其余一个缓解方案目录下之之一一个
    ASP.NET 5 项目搬迁到目前项目下,只要将该项目目录 ( src\projectName
    ) 直接倒到当下方案的 src\ 目录下即可,其他甚都毫不安装!

    人事档案 4

随即我们进入 ASPNET5WebApp 项目文件夹
(如下图),项目的目录结构吧跟之前差别甚酷啊,我平由臻到下独家介绍一通:

人事档案 5

  • bower_components文件夹:由于 Visual Studio 2015 与 Web 前端最常用之 bower 工具整合在一起,未来具有的「前端」套件通过 bower 命令进行安装时,都见面自行将套件安装及bower_components文件夹之中。这个文件夹不应进入版本控制。
  • Compiler文件夹:ASP.NET MVC 6 ( 等同于 ASP.NET 5 ) 开始,将支撑 Razor 预先编译功能,可以叫你以布局网站时事先编译所有 Razor页面,以提升网站实行的速度。在这文件夹着生出只Compiler\Preprocess\RazorPreCompilation.cs文本,可以给您设置是否如启用 Razor 自动编译功能。(只要取消注释掉的程序代码就足以启用 Razor 预先编译机制)

    人事档案 6

  • Controllers文本夹:这个是 ASP.NET MVC 6 的 Controllers 专用文件夹。

  • Migrations文本夹:这个是 Entity Framework 的 DbMigration 专用文件夹。
  • Models文本夹:这个是 ASP.NET MVC 6 的 Models 专用文件夹。
  • node_modules文件夹:由于 Visual Studio 2015 将 nodejs
    常用的 npm
    套件管理工具整合在一起,未来所有的 npm 组件都可通过 npm 命令进行安装,且这些零件默认的设置都见面设置至node_modules文件夹之中。注意这个文件夹不应有加入版本控制。
  • Properties文本夹:这个文件夹和之前多,也是因此来保存有种类之专门设置,例如网站发行安排文件等。但除此之外,还差不多矣一个 AppSettings.cs 类别文件,这个文件根本目的是因此来定义一个 AppSettings (应用程序设定) 的型类 (Model Class),让你用强型别的方式读取应用程序配置参数。
  • Views文件夹:这个是 ASP.NET MVC 6 的 Views 专用文件夹。
  • wwwroot文本夹:这个文件夹就是新的事物了,未来的 ASP.NET 5 只要是「静态文件」,例如 js, css, images, … 诸如此类的静态文件,都见面合并置于这个文件夹里面,避免前端文件和后端程序代码混在一块儿的事态。ASP.NET5凡是彻底模块化了,IIS不再是运作MVC程序的绝无仅有容器,任何兼容DNX的运转容器都足以运作MVC程序,程序发布包被分成approot和wwwroot两独片,分别寄存应用程序集(或源码)和静态文件,从而就还好的离别。
  • *.xproj文本:这是新一代的色文件,有别于以前的*.csproj与*.vbproj项目档案,这个类型文件小多了,内容格式差不多,一样是 XML 的格式,一样是 MSBuild 会去参考的内容,但顶充分之不同之处在于,新版*.xproj毫无还显列出所有的文本清单,所有品类中之公文不再需要特地在或者移除,只要档案出现在路目录中,文件就会自行为加入项目里!进一步加剧约定胜吃配置规格,项目被因故非交的文件乖乖删除吧,这样即便好将品种蒙众多无该有的垃圾文件清理了,相信大家对这点好有感动吧。
  • *.xproj.user文件:这个文件用来记录项目在 Visual Studio 2015 开发工具里之片段状态,例如你曾经开之文书列表等暂存信息。这个文件不该投入版本控制。
  • bower.json文件:这是 bower 工具专用的配置文件,与 ASP.NET 5 没有一直关联,相关文书要参考这里:http://bower.io/docs/config/
  • config.json文本:这是 ASP.NET 5 的种类布局文件,所有应用程序参数设置与连接字符串都见面定义在是。
  • 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 构建的年月。

  • Project_Readme.html文件:项目说明档,该网页有多参照链接,可以叫您深深摸底 ASP.NET 5 的开发方式。
  • Startup.cs文件:这个文件是要的 ASP.NET 5 网站启动入口,由于 ASP.NET 5 执行生命周期的改观,以前的 global.asax 文件已经变成往返云烟不复存在了,取而代之的哪怕是 Startup.cs 文件里之 Startup 类。换句话说,未来 ASP.NET 5 应用程序启动时,第一时间就是打 Startup 类开始实行之!

本文概要的牵线 ASP.NET 5 全新的品类目录结构与 xproj 项目文件,以及部分杀关键之公文,都是索要专门额外学习之一些,博客园的”汤姆大叔”通过翻阅微软的源码以及网络达到之有的章于大家整理了一个多元入门教程。且其中的代码都于VS 2015 RC中进行过证实。作者为也这些文章建立了一个目录
http://www.cnblogs.com/TomXu/p/4496545.html ,这个系列文章我呢于微信公众号opendotnet 上转载了,欢迎关注微信公众号opendotnet,通过历史信息看:

  1. ASP.NET 5简介

  2. 新认识路

  3. 种揭示和部署

  4. 核心技术与环境布置

  5. Configuration配置信息保管

  6. Middleware详解

  7. 因注入

  8. Session与Caching

  9. 日志框架

  10. Controller与Action

  11. Routing路由

  12. 基于Lamda表达式的强类型Routing实现

  13. TagHelper

  14. View
    Component

  15. MvcOptions配置

  16. 从定义View视图文件查找逻辑

  17. MVC中之另外新特点

 

.Net 如何模拟会话级别的信号量,对http接口调用频率进行限定(有demo)

当今,因为种种因素,你必须对一个央或措施开展频率上之访限制。
据,
你对外提供了一个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   }

诸如此类的思考以及实现相对来说非常简单,但是依据这样的一个模型设定,那么就会现出这种状况:

 澳门新葡亰官网 1

 

设齐图,每个点代表一样不行走访请求,我在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个线程去访问。

 

4容器4线程模型

本,在贯彻代码的事先我们事先规划一个型。

澳门新葡亰官网 2

  假设我们出一个用户A的管道,这个管道里装在用户A的要,比如用户A在一如既往秒钟发出了10破呼吁,那么每一个请求过来,管道里之要素都见面多一个。但是我们设定是管道最多只能容10个因素,而且每个元素的存活期为1秒,1秒后虽说该因素消失。那么这样设计吧,无论是速率还是多少之突进,都见面发出管道长度的限量。这样一来,无论由哪一个时节点还是时间距离出发,这个管道都能满足我们的频率限制需求。

假设这里的管道,就必须跟会话Id来对号入座了。每当发生新会话进来的时段就是很成一个新管道。这个会话id根据自己场景所定,可以是sessionId,可以是ip,也足以是token。

这就是说既是管道是碰头说话级别的,我们定得用一个容器,来装这些管道。现在,我们坐IP来命名会话管道,并把具有的管道还装在一个器皿被,如图

澳门新葡亰官网 3

若果据悉刚才底设定,我们尚需对容器内的各国条管道的素进行处理,把过的吃删除掉,为这个,还待单独为该容器开辟有一个线程来吧各个条管道展开元素的清理。而当管道的因素呢0时,我们即便到底掉该管道,以便节省容器空间。

 澳门新葡亰官网 4

自然,由于用户量基本上,一个容器内或者有上万独管道,这个上偏偏用一个容器来装来清理,在效率达明显是不够的。这个时节,我们就算得对容器进行横向扩张了。

  比如,我们得以根据Cpu核心数自动生成对应之数据之容器,然后根据一个算法,对IP来拓展导流。我当下cpu是4只逻辑核心,就不行成了4个容器,每当用户访问的时刻,都见面冠经过一个算法,这个算法会对IP进行处理,如192.168.1.11~192.168.1.13以此Ip段进第一个容器,xxx~xxx进第二只容器,依次类推,相应的,也尽管闹了4个线程去分别处理4个容器被的管道。

澳门新葡亰官网 5

 

那么,最终便形成了咱们的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的。

 澳门新葡亰官网 6澳门新葡亰官网 7

分布式下Redis

点介绍了同等种频率限制的范,分布式与单机相比,无非就是是载体不同,我们设把这个容器的载体从程序上移植出来,来弄成一个独门的劳务或者直接借用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即可。

 澳门新葡亰官网 8

那么因此Redis来兑现之代码那就算是类似这种:

澳门新葡亰官网 9

透过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的实例来实现。最后放上效果图。

澳门新葡亰官网 10

最终,我将这些都受做成了个Demo。但是没找到合适的上传网盘,所以大家可以留邮箱(留了便作),或者直接加QQ群文件自取,讨论交流:166843154

 

本身爱好跟本身同样的口交朋友,不吃环境影响,自己是投机之师资,欢迎加群
.Net web交流群, QQ群:166843154 欲望与挣扎

 

作者:小曾
出处:http://www.cnblogs.com/1996V/p/8127576.html 欢迎转载,但任何转载必须保留完整文章及博客园出处,在显要地方显示署名以及原文链接。
.Net交流群, QQ群:166843154 欲望与挣扎 

认识ASP.NET 5类别组织及种文件xproj

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模板创建项目,图示如下:

澳门新葡亰网址 1

缔造好路后,并参考下图打开项目的八方文件夹,解决方案目录结构:

澳门新葡亰网址 2

其实文件夹的目结构,我们视有几乎独文本夹,下面我们开展逐一介绍

澳门新葡亰网址 3

  • .vs 隐藏文件夹:用来保存原本我们于VS2003-2013档次目录中见面见到底
    *.suo 文件,这个文件根本用于保存 Visual Studio 2015
    操作过程的部分态,例如你曾经开启之档案列表等临时的消息。如果
    ASP.NET 5 网站使用 IISExpress 进行排错,IISExpress 所需要的
    applicationhost.config 配置文件也会放在 .vs\config\ 目录下。
    这些临时之文书未应该放入到源代码版本控制,这个算一个更上一层楼。
  • artifacts
    文件夹:用来保存网站构建过程中需现保存之元文件案与输出文件,也就是是先前在列蒙常常看到的
    bin 与 obj
    目录,现在犹统一搬迁至者文件夹下。这个文件夹不应当进入版本控制,这又是均等很改善。
  • src
    文件夹:用来放置该方案里之所有品类,所以要的源代码都见面放于斯目录下,该目录下每个目录就是一个独立的品种。
  • *.sln
    项目文件:这个文件就不要介绍了,跟之前我们经常来看的类解决方案是全然同的。
  • global.json
    全局配置文件:这个文件一般都跟项目解决方案在同等层文件夹下,用来叫解决方案参考用之。主要用来定义要「自动导入」到解决方案文件中的路线列表与
    sdk 的默认版本。如下图的 “projects” 参数就发出列有设定的会导入入 src
    与 test
    文件夹下具有的路。举例来说,如果你想以其他一个缓解方案目录下之某个一个
    ASP.NET 5 项目搬迁到眼前色下,只要将该品种目录 ( src\projectName
    ) 直接倒到当下方案的 src\ 目录下即可,其他甚都休想安装!

    澳门新葡亰网址 4

随后我们进入 ASPNET5WebApp 项目文件夹
(如下图),项目的目录结构吧跟之前差别非常充分啊,我同样由臻到下独家介绍一全方位:

澳门新葡亰网址 5

  • bower_components文件夹:由于 Visual Studio 2015 与 Web 前端最常用的 bower 工具整合在一起,未来具有的「前端」套件通过 bower 命令进行设置时,都见面自行将套件安装到bower_components文件夹之中。这个文件夹不应当投入版本控制。
  • Compiler文件夹:ASP.NET MVC 6 ( 等同于 ASP.NET 5 ) 开始,将支持 Razor 预先编译功能,可以吃您以布局网站时事先编译所有 Razor页面,以提升网站实施之快慢。在斯文件夹着生只Compiler\Preprocess\RazorPreCompilation.cs文本,可以让你设置是否如启用 Razor 自动编译功能。(只要取消注释掉的程序代码就好启用 Razor 预先编译机制)

    澳门新葡亰网址 6

  • Controllers文件夹:这个是 ASP.NET MVC 6 的 Controllers 专用文件夹。

  • Migrations文件夹:这个是 Entity Framework 的 DbMigration 专用文件夹。
  • Models文件夹:这个是 ASP.NET MVC 6 的 Models 专用文件夹。
  • node_modules文件夹:由于 Visual Studio 2015 将 nodejs
    常用的 npm
    套件管理工具整合在一起,未来具有的 npm 组件都可以透过 npm 命令进行设置,且这些组件默认的安装都见面装及node_modules文本夹之中。注意这文件夹不该加入版本控制。
  • Properties文件夹:这个文件夹和之前多,也是故来保存有型的特别设置,例如网站发行安排文件等。但除了,还多了一个 AppSettings.cs 类别文件,这个文件要目的是用来定义一个 AppSettings (应用程序设定) 的范类 (Model Class),让你用强型别的方法读取应用程序配置参数。
  • Views文本夹:这个是 ASP.NET MVC 6 的 Views 专用文件夹。
  • wwwroot文件夹:这个文件夹就是崭新的物了,未来底 ASP.NET 5 只要是「静态文件」,例如 js, css, images, … 诸如此类的静态文件,都见面联合置于这个文件夹里面,避免前端文件及后端程序代码混在一齐的情景。ASP.NET5凡干净模块化了,IIS不再是运行MVC程序的绝无仅有容器,任何兼容DNX的运作容器都好运行MVC程序,程序发布包给分为approot和wwwroot两单部分,分别存放应用程序集(或源码)和静态文件,从而成就还好的分离。
  • *.xproj文本:这是新一代的型文件,有别于以前的*.csproj与*.vbproj项目档案,这个路文件小多了,内容格式差不多,一样是 XML 的格式,一样是 MSBuild 会去参考的情,但最好深之不同之处在于,新版*.xproj不要再明确列出所有的文件清单,所有种类遭到之文书不再用专门在或者移除,只要档案出现在类型目录中,文件就会见活动为在项目里!进一步加重约定胜为配置原则,项目蒙之所以非顶的文本乖乖删除吧,这样虽得拿路遭到很多不欠存在的垃圾文件清理了,相信大家对当下点杀有令人感动吧。
  • *.xproj.user文件:这个文件用来记录项目以 Visual Studio 2015 开发工具里的有的状态,例如你已开之公文列表等暂存信息。这个文件不应当加入版本控制。
  • bower.json文件:这是 bower 工具专用的部署文件,与 ASP.NET 5 没有一直关乎,相关文件要参见这里:http://bower.io/docs/config/
  • config.json文本:这是 ASP.NET 5 的门类安排文件,所有应用程序参数设置与连接字符串都见面定义在是。
  • 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 构建的时空。

  • Project_Readme.html文本:项目说明档,该网页有那么些参照链接,可以给您深深了解 ASP.NET 5 的开发方式。
  • Startup.cs文件:这个文件是必不可缺之 ASP.NET 5 网站启动入口,由于 ASP.NET 5 执行生命周期的改,以前的 global.asax 文件就成为过往云烟不复存在了,取而代之的饶是 Startup.cs 文件里的 Startup 类。换句话说,未来 ASP.NET 5 应用程序启动时,第一时间就是由 Startup 类开始施行的!

正文概要的介绍 ASP.NET 5 全新的种目录结构以及 xproj 项目文件,以及有好重要的文书,都是用专门额外学习的一对,博客园的”汤姆大叔”通过看微软的源码以及台网直达的组成部分篇章于大家整理了一个多元入门教程。且其中的代码都当VS 2015 RC中开展了证实。作者也也这些文章建立了一个目录
http://www.cnblogs.com/TomXu/p/4496545.html ,这个系列文章我哉以微信公众号opendotnet 上转载了,欢迎关注微信公众号opendotnet,通过历史信息看:

  1. ASP.NET 5简介

  2. 乍识路澳门新葡亰网址

  3. 色揭示暨配置

  4. 核心技术与环境布置

  5. Configuration配置信息保管

  6. Middleware详解

  7. 仰注入

  8. Session与Caching

  9. 日志框架

  10. Controller与Action

  11. Routing路由

  12. 基于Lamda表达式的强类型Routing实现

  13. TagHelper

  14. View
    Component

  15. MvcOptions配置

  16. 自定义View视图文件查找逻辑

  17. MVC中之别新特征

 

【转】你知道C#中的Lambda表达式的演化过程吗?

【转】你知道C#面临的Lambda表达式的演化过程吗?

那得从十分悠久很久以前说从了,记得很时候…

稀里糊涂的记从前生个让委托的事物是那么的胜深难理解。

委托的下

例一:

图片 1

嗬是信托?

个体掌握:所以来传递方式的种类。(因此来传递数字的品类有int、float、double,用来传递方式的就是来嘱托

例二:

图片 2

并且通过了老大遥远很久…

匿名方式

过剩时分委托接收的章程是一次性的或者方法体是非常简单的…

例三:

图片 3

咱们好形容成:

图片 4

发生没出察觉我们每次都要定义委托,很多上签名可能是相同的。这样便从来不必要定义再度的。

然后还要过了怪悠久很久…

Func和Action

唯恐非常也认为我们每次定义委托有接触痴,所以索性在框架内一样软定义好有可能就此到的信托。那变幻的方签名怎么可能定义得咸?没关系,定义成泛型的莫就是可了也。

先说Func:

图片 5

细之心上人或者看到了,Func相对于AddDelegate多定义了一个int。多出了底坏是乘的凡归路。我们F12扣对应之概念:

图片 6

至于地方Func的写法我们好简写成:(语法糖而已,编译后抑注释的代码

图片 7

再看Action:

图片 8

提示:以后如我们形容代码的下如果写到到delegate…,你要是立马想到是否好为此Func或者Action来取代吗?C#4蒙的Action和Func有16只参数,足够你用了。

咱俩当了以等,又过了好久好久…

Lambda的诞生

图片 9

自家XX,这TM就是亲自兄弟啊。直接去丢delegate关键字,然后加一个=>就成为了lambda表达式了。(=>读作goes to

咱继承简化:

图片 10

丢掉参数类型为是可的,因为强大的VS可以依据泛型委托Func自己想出来参数类型。

尚得简化为?当然:

图片 11

return关键字为决不了,大括哀号也决不了。(当然,方法体只生单纯条告句才能够怎么开

现在扣起就不行接近我们平素于是底Lambda表达式了。

要传入参数就来一个吧,我们还好继承简化:

图片 12

立就是咱平常呈现得极其多的lambda长相了。

一旦长大这样吗是产生求的:

  1. 不得不发出一个传出参数
  2. 方法体只能只同修语句。

至于第1点,lambda我们平常所以得比多之是冲IEnumerable或IQueryable,所以不得不发出一个参数为便满足了。

有关第2点,我们利用扩展方法的链式编程来解决。

如:(用链式来化解第二碰)

图片 13

事后,我们了上了福之生活…

 

借《深入理解C#》中之等同图:

图片 14

 

小知识:(异步Lambda)

Func<Student, Task<bool>> func = async t =>
{
    await Task.Delay(100);//等待100毫秒
    return false;
};

 

结束:

本文简短的说了下lambda表达式在C#屡遭的一步步演化。说之未必然对,轻拍!

本文为同到《C#基础知识巩固系列》

澳门新葡亰官网MySQL CodeFirst的安排和注意事项

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,成功后用会见冒出如图所示信息:

澳门新葡亰官网 1

注意:此时以列澳门新葡亰官网下会自动生成文件夹和一个类,如图所示:

澳门新葡亰官网 2

7.开辟Configuration.cs,将AutomaticMigrationsEnabled的价修改也true,并且于先后包管理器控制高运行命令update-database
-force,成功后用会见现出如图所示信息:

澳门新葡亰官网 3

只顾:没当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的数据库列表可以窥见新变化的数据库:

澳门新葡亰官网 4

留意:①自动生成了__migrationhistory表说明配置非常成功。②PersonConfig.cs里之this.ToTable(“T_Persons”);影响实体类映射成功后底表名。③默认Id字段为主键并且自增,因此不需要手动为Id属性赋值。

 

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》

认识ASP.NET 5档组织与项目文件xproj

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模板创建项目,图示如下:

档案馆 1

创立好项目后,并参照下图打开项目之四处文件夹,解决方案目录结构:

档案馆 2

事实上文件夹的目录结构,我们视出几独公文夹,下面我们开展逐一介绍

档案馆 3

  • .vs 隐藏文件夹:用来保存原本我们在VS2003-2013档目录中见面看的
    *.suo 文件,这个文件要用以保存 Visual Studio 2015
    操作过程的有状态,例如你都开的档案列表等临时之音讯。如果
    ASP.NET 5 网站使用 IISExpress 进行排错,IISExpress 所需要之
    applicationhost.config 配置文件呢会见在 .vs\config\ 目录下。
    这些临时的文件不该放入到源代码版本控制,这个算一个更上一层楼。
  • artifacts
    文件夹:用来保存网站构建过程遭到需现保存之元文件案与输出文件,也不怕是先前在类型受到不时看到底
    bin 与 obj
    目录,现在都统一搬迁至之文件夹下。这个文件夹不该进入版本控制,这还要是如出一辙异常改善。
  • src
    文件夹:用来放该方案里的享有种类,所以要的源代码都见面推广于斯目录下,该目录下每个目录就是一个独的型。
  • *.sln
    项目文件:这个文件就无须介绍了,跟之前我们常常看到底项目解决方案是全然同的。
  • global.json
    全局配置文件:这个文件一般都和项目解决方案在同样层文件夹下,用来深受解决方案参考用底。主要用以定义要「自动导入」到解决方案文件被之路列表与
    sdk 的默认版本。如下图的 “projects” 参数就产生列有设定的会导入入 src
    与 test
    文件夹下具有的品种。举例来说,如果你想拿其它一个化解方案目录下的有一个
    ASP.NET 5 项目搬迁到手上型下,只要以欠类型目录 ( src\projectName
    ) 直接倒到当下方案的 src\ 目录下即可,其他什么都不用安装!

    档案馆 4

随着我们登 ASPNET5WebApp 项目文件夹
(如下图),项目的目录结构吧跟之前差别很特别哦,我平由达到及下各自介绍一百分之百:

档案馆 5

  • bower_components文件夹:由于 Visual Studio 2015 与 Web 前端最常用的 bower 工具整合在一起,未来备的「前端」套件通过 bower 命令进行安装时,都见面活动将套件安装及bower_components文件夹之中。这个文件夹不该在版本控制。
  • Compiler文件夹:ASP.NET MVC 6 ( 等同于 ASP.NET 5 ) 开始,将支持 Razor 预先编译功能,可以让您于布局网站经常优先编译所有 Razor页面,以提升网站实施之速度。在这个文件夹着生只Compiler\Preprocess\RazorPreCompilation.cs文件,可以被你设置是否要启用 Razor 自动编译功能。(只要取消注释掉的程序代码就足以启用 Razor 预先编译机制)

    档案馆 6

  • Controllers文本夹:这个是 ASP.NET MVC 6 的 Controllers 专用文件夹。

  • Migrations文本夹:这个是 Entity Framework 的 DbMigration 专用文件夹。
  • Models文本夹:这个是 ASP.NET MVC 6 的 Models 专用文件夹。
  • node_modules文件夹:由于 Visual Studio 2015 将 nodejs
    常用的 npm
    套件管理工具整合在一起,未来有所的 npm 组件都得以经过 npm 命令进行安装,且这些零件默认的安都见面设置至node_modules文本夹之中。注意是文件夹不应当加入版本控制。
  • Properties文件夹:这个文件夹和之前多,也是用来保存有档之专门设置,例如网站发行安排文件等。但除了,还差不多矣一个 AppSettings.cs 类别文件,这个文件要目的是用来定义一个 AppSettings (应用程序设定) 的范类 (Model Class),让你用强型别的办法读取应用程序配置参数。
  • Views文件夹:这个是 ASP.NET MVC 6 的 Views 专用文件夹。
  • wwwroot文本夹:这个文件夹就是全新的东西了,未来的 ASP.NET 5 只要是「静态文件」,例如 js, css, images, … 诸如此类的静态文件,都见面合并置于这个文件夹里面,避免前端文件与后端程序代码混在联合的动静。ASP.NET5凡是干净模块化了,IIS不再是运作MVC程序的唯一容器,任何兼容DNX的运行容器都好运行MVC程序,程序发布包给分成approot和wwwroot两单部分,分别寄存应用程序集(或源码)和静态文件,从而做到双重好之分开。
  • *.xproj文件:这是初一代之类型文件,有别于以前的*.csproj与*.vbproj项目档案,这个类别文件小多矣,内容格式差不多,一样是 XML 的格式,一样是 MSBuild 会去参考的内容,但绝可怜的不同之处在于,新版*.xproj不要再行显列出所有的文本清单,所有种类受到之公文不再要特别在或者移除,只要档案出现在品种目录中,文件就见面活动为投入项目里!进一步深化约定胜于配置标准,项目受到因故非顶之文书乖乖删除吧,这样便好管种蒙很多请勿欠是的垃圾文件清理了,相信大家对这点杀有令人感动吧。
  • *.xproj.user文件:这个文件用来记录项目在 Visual Studio 2015 开发工具里的片状态,例如你曾被之公文列表等暂存信息。这个文件不应进入版本控制。
  • bower.json文件:这是 bower 工具专用的布局文件,与 ASP.NET 5 没有直接涉及,相关文件要参见这里:http://bower.io/docs/config/
  • config.json文件:这是 ASP.NET 5 的档次配置文件,所有应用程序参数设置与连接字符串都见面定义在此。
  • 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 构建的辰。

  • Project_Readme.html文件:项目说明档,该网页有成千上万参阅链接,可以叫你深切摸底 ASP.NET 5 的开发方式。
  • Startup.cs文件:这个文件是必不可缺之 ASP.NET 5 网站启动入口,由于 ASP.NET 5 执行生命周期的改,以前的 global.asax 文件已成过往云烟不复存在了,取而代之的饶是 Startup.cs 文件里之 Startup 类。换句话说,未来 ASP.NET 5 应用程序启动时,第一时间就是由 Startup 类开始实施之!

正文概要的介绍 ASP.NET 5 全新的路目录结构以及 xproj 项目文件,以及有十分重要的文书,都是用专门额外学习的一对,博客园的”汤姆大叔”通过看微软的源码以及台网直达的组成部分篇章于大家整理了一个多元入门教程。且其中的代码都当VS 2015 RC中展开了证实。作者也也这些文章建立了一个目录
http://www.cnblogs.com/TomXu/p/4496545.html ,这个系列文章我也以微信公众号opendotnet 上转载了,欢迎关注微信公众号opendotnet,通过历史信息看:

  1. ASP.NET 5简介

  2. 乍认识路

  3. 色揭示暨配置

  4. 核心技术与环境布置

  5. Configuration配置信息保管

  6. Middleware详解

  7. 仰注入

  8. Session与Caching

  9. 日记框架

  10. Controller与Action

  11. Routing路由

  12. 基于Lamda表达式的强类型Routing实现

  13. TagHelper

  14. View
    Component

  15. MvcOptions配置

  16. 自定义View视图文件查找逻辑档案馆

  17. MVC中的别样新特征

 

澳门新葡亰官网【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。
  • 得转载该博客,但得著名博客来源。

个人档案WSDL接口数据传递与外网发布得专注的地方

A系统传递数据给B系统

1、A创建asmx推送接口如下

个人档案 1个人档案 2

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接口,接受该服务多少

个人档案 3个人档案 4

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方便得差不多

 

网站地图xml地图