NancyFx 2.0的开源框架的使用-Caching
新建一个空的Web项目,命名CachingDemo
然后添加三个Nuget安装包
- Nancy
- Nancy.Hosting.Aspnet
- Nancy.ViewsEngines.Razor
然后往项目里面添加Models,Module,Views三个文件夹
再往Models文件夹里面添加CachingExtensions文件夹
然后往CachingExtensions文件夹里面添加ContextExtensions类
public static class ContextExtensions
{
public const string OUTPUT_CACHE_TIME_KEY = "OUTPUT_CACHE_TIME"; //启用此路由的输出缓存
public static void EnableOutputCache(this NancyContext context,int seconds)
{
context.Items[OUTPUT_CACHE_TIME_KEY]=seconds;
}
//禁用此路由的输出缓存
public static void DisableOutputCache(this NancyContext context)
{
context.Items.Remove(OUTPUT_CACHE_TIME_KEY);
}
}
再往Models文件夹里面添加CachedResponse类
//在缓存的响应中封装常规响应
//缓存的响应调用旧的响应并将其存储为字符串。
//显然, 这只适用于基于 ascii 文本的响应, 所以不要使用此
//在实际应用中:-)
private readonly Response response;
public CachedResponse(Response response)
{
this.response = response;
this.ContentType = response.ContentType;
this.Headers = response.Headers;
this.Contents = this.GetContents();
}
public override Task PreExecute(NancyContext context)
{
//return base.PreExecute(context);
return this.response.PreExecute(context);
}
private Action<Stream> GetContents()
{
return stream =>
{
using (var memoryStream = new MemoryStream())
{
this.response.Contents.Invoke(memoryStream);
var contents = Encoding.ASCII.GetString(memoryStream.GetBuffer());
var writer = new StreamWriter(stream)
{
AutoFlush = true
};
writer.Write(contents);
}
};
}
然后往Module文件夹里面添加MainModule类
public MainModule()
{
Get("/",Lexan=>
{
return View["index.cshtml",DateTime.Now.ToString()];
});
Get("/cached",Lexan=>
{
this.Context.EnableOutputCache();
return View["Payload.cshtml",DateTime.Now.ToString()];
});
Get("/uncached",Lexan=>
{
this.Context.DisableOutputCache();
return View["Payload.cshtml",DateTime.Now.ToString()];
});
}
继续往根目录添加Bootstrapper类
private const int CACHE_SECONDS = ;
private readonly Dictionary<string, Tuple<DateTime, Response, int>> cachedResponses = new Dictionary<string, Tuple<DateTime, Response, int>>();
protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines)
{
base.ApplicationStartup(container, pipelines);
pipelines.BeforeRequest += CheckCache;
pipelines.AfterRequest += SetCache;
}
//检查我们是否有缓存条目-如果我们做了, 看看它是否已经过期,
//如果没有返回, 否则返回 null;
public Response CheckCache(NancyContext context)
{
Tuple<DateTime, Response, int> cacheEntry;
if (this.cachedResponses.TryGetValue(context.Request.Path,out cacheEntry))
{
if (cacheEntry.Item1.AddSeconds(cacheEntry.Item3)>DateTime.Now)
{
return cacheEntry.Item2;
}
}
return null;
}
//如果需要, 将当前响应添加到缓存中
//仅按路径存储, 并将响应存储在字典中。
//不要将此作为实际缓存:-)
public void SetCache(NancyContext contexts)
{
if (contexts.Response.StatusCode!=HttpStatusCode.OK)
{
return;
}
object cacheSecondsObject;
if (!contexts.Items.TryGetValue(ContextExtensions.OUTPUT_CACHE_TIME_KEY,out cacheSecondsObject))
{
return;
}
int cacheSeconds;
if (!int.TryParse(cacheSecondsObject.ToString(),out cacheSeconds))
{
return;
}
var cachedResponse = new CachedResponse(contexts.Response);
this.cachedResponses[contexts.Request.Path]=new Tuple<DateTime, Response, int>(DateTime.Now,cachedResponse,cacheSeconds);
contexts.Response = cachedResponse;
}
然后往Views文件夹里面添加index,payload,两个视图
index页面
<!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>首页</title>
</head>
<body>
<div>
<h1>缓存Demo</h1>
<p><a href="/cached">Cached页面</a></p>
<p><a href="/uncached">Uncached页面</a></p>
</div>
</body>
</html>
Payload页面
<!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>首页</title>
</head>
<body>
<div>
<h1>缓存Demo</h1>
<p>此页是在: @Model</p>
<p>这可能是或可能不会被缓存</p>
<a href="/">主页</a>
</div>
</body>
</html>
修改Web.config配置文件
<httpHandlers>
<add verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" path="*" />
</httpHandlers>
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<add name="Nancy" verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" path="*" />
</handlers>
</system.webServer>
然后运行一下项目F5
谢谢你的欣赏,如有不对请多多指教!
NancyFx 2.0的开源框架的使用-Caching的更多相关文章
- NancyFx 2.0的开源框架的使用-Basic
这是NancyFx开源框架中的Basic认证,学习一下! 首先当然是新建一个空的Web,BasicDemo 继续在项目中添加Nuget包,记得安装的Nuget包是最新的预发行版 Nancy Nancy ...
- NancyFx 2.0的开源框架的使用-CustomModule(自定义模块)
NancyFx框架的自定义模块 新建一个空的Web项目 然后通过NuGet库安装下面的包 Nancy Nancy.Hosting.Aspnet 然后添加Models,Module,Views三个文件夹 ...
- NancyFx 2.0的开源框架的使用-ModelBinding(实现绑定)
NancyFx框架中使用绑定模型 新建一个空的Web程序 然后安装Nuget库里面的包 Nancy Nancy.Hosting.Aspnet Nancy.ViewEnglines.Spark 并在We ...
- NancyFx 2.0的开源框架的使用-HosingOwin
Nancy框架的Owin使用 先建一个空的Web项目 然后往Nuget库里面添加Nancy包 Nancy Nancy.Owin Nancy.ViewEnglines.Spark 然后添加Models, ...
- NancyFx 2.0的开源框架的使用-Authentication
新建一个空的项目 新建好了空的项目以后,接着通过NuGet安装一下三个包 Nancy Nancy.Hosting.Aspnet Nancy.ViewEnglines.Razor 然后在项目中添加Mod ...
- NancyFx 2.0的开源框架的使用-Forms
同样的像前面2篇博文一样,每个项目的开始基本都是建个空的Web项目 在NuGet库中安装以下几个NuGet包 Nancy Nancy.Authentication.Forms Nancy.Hostin ...
- NancyFx 2.0的开源框架的使用-Stateless
同样和前面一样新建一个空的Web项目,都在根目录添加Module,Models,Views文件夹 添加Nuget包 在Models文件夹里面添加UserModel类 public string Use ...
- NancyFx 2.0的开源框架的使用-Stateless(二)
继续上一篇Stateless的博文,在上一篇的博文的基础上稍微加点东西 接下来右键解决方案添加新项目,一样建一个空的Web项目 然后在StatelessDemoWeb项目里面添加Views文件夹,Sc ...
- NancyFx 2.0的开源框架的使用-AspnetBootstrapping
新建一个空的Web项目AspnetBootstrappingDemo 然后添加NuGet组件 Nancy Nancy.Hosting.Aspnet Nancy.ViewEngines.Razor 继续 ...
随机推荐
- iphone与安卓的兼容性问题汇总
1.日期问题 当使用yyyy-mm-dd格式时,iphone不认,安卓没问题 解决办法:new Date(res.data[i].inventoryDate.replace(/-/g, "/ ...
- 在 WPF 中使用 Path 路径
在 WPF 中总会修改 Button 的 Style,比如一个自定义的 Close 按钮.刚入门的可能会用一张 PNG 格式的图片来做这个按钮的 Icon,但这个是不优雅的.而且你要改的时候还得去操作 ...
- 关于ng-class的用法
ng-class的使用几种方式 (1):利用双向数据绑定(className根据chang2的值去匹配类) <div class="{{className}}">... ...
- 统一我的博客文章的CSS样式代码
一.前因后果 之前写博客的时候也有写一些CSS代码来美化,不过都是凌乱的,每次再写一篇,又得重头来过去想,或者去拷贝原来的CSS设置.由于逻辑性不强,找一个配套的格式出来要花费不少时间. 今天我把部分 ...
- C# WebClient、jQuery ajax jsonp实现跨域
WebClient 无传输数据获取 Uri uri = new Uri(allURL); WebClient wc = new WebClient(); wc.Encoding = System.Te ...
- Lambda&Java多核编程-7-类型检查
本篇主要介绍Lambda的类型检查机制以及周边的一些知识. 类型检查 在前面的实践中,我们发现表达式的类型能够被上下文所推断.即使同一个表达式,在不同的语境下也能够被推断成不同类型. 这几天在码一个安 ...
- 为部署ASP.NET Core准备:使用Hyper-V安装Ubuntu Server 16.10
概述 Hyper-V是微软的一款虚拟化产品,和VMWare一样采用的hypervisor技术.它已经被内嵌到Win10系统内,我们只需要进行简单的安装即可.但是前提是要确保你的机器已经启用虚拟化,可以 ...
- TCP/IP笔记(七)TCP详解
TCP的特点及其目的 为了通过数据包实现可靠性传输,需要考虑很多事情,例如数据的破坏.丢包.重复记忆分片顺序混乱等问题.如不能解决这些问题,也就无从谈起可靠传输. TCP通过检验和.序列号.确认应答. ...
- Mac IDEA插件——protobuf 插件
最近在搞PB的版本的升级,历史的PB的版本是2.4,现在是打算升级到3.2,当面PB的版本肯定有很多变化了,就不再这里多说了,这里重点说一说,采用IDEA的插件方便执行PB的文件的JAVA编译,这样的 ...
- NI Vision for LabVIEW 基础(一):NI Vision 简介
NI Vision 控件模板 Vision控件模板位于LabVIEW控件模板的最顶层,由一下元素组成: IMAQ Image.ctl—该控件是一个类型定义,用于声明图象类型的数据.在VI的前面板中使用 ...