新建一个空的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的更多相关文章

  1. NancyFx 2.0的开源框架的使用-Basic

    这是NancyFx开源框架中的Basic认证,学习一下! 首先当然是新建一个空的Web,BasicDemo 继续在项目中添加Nuget包,记得安装的Nuget包是最新的预发行版 Nancy Nancy ...

  2. NancyFx 2.0的开源框架的使用-CustomModule(自定义模块)

    NancyFx框架的自定义模块 新建一个空的Web项目 然后通过NuGet库安装下面的包 Nancy Nancy.Hosting.Aspnet 然后添加Models,Module,Views三个文件夹 ...

  3. NancyFx 2.0的开源框架的使用-ModelBinding(实现绑定)

    NancyFx框架中使用绑定模型 新建一个空的Web程序 然后安装Nuget库里面的包 Nancy Nancy.Hosting.Aspnet Nancy.ViewEnglines.Spark 并在We ...

  4. NancyFx 2.0的开源框架的使用-HosingOwin

    Nancy框架的Owin使用 先建一个空的Web项目 然后往Nuget库里面添加Nancy包 Nancy Nancy.Owin Nancy.ViewEnglines.Spark 然后添加Models, ...

  5. NancyFx 2.0的开源框架的使用-Authentication

    新建一个空的项目 新建好了空的项目以后,接着通过NuGet安装一下三个包 Nancy Nancy.Hosting.Aspnet Nancy.ViewEnglines.Razor 然后在项目中添加Mod ...

  6. NancyFx 2.0的开源框架的使用-Forms

    同样的像前面2篇博文一样,每个项目的开始基本都是建个空的Web项目 在NuGet库中安装以下几个NuGet包 Nancy Nancy.Authentication.Forms Nancy.Hostin ...

  7. NancyFx 2.0的开源框架的使用-Stateless

    同样和前面一样新建一个空的Web项目,都在根目录添加Module,Models,Views文件夹 添加Nuget包 在Models文件夹里面添加UserModel类 public string Use ...

  8. NancyFx 2.0的开源框架的使用-Stateless(二)

    继续上一篇Stateless的博文,在上一篇的博文的基础上稍微加点东西 接下来右键解决方案添加新项目,一样建一个空的Web项目 然后在StatelessDemoWeb项目里面添加Views文件夹,Sc ...

  9. NancyFx 2.0的开源框架的使用-AspnetBootstrapping

    新建一个空的Web项目AspnetBootstrappingDemo 然后添加NuGet组件 Nancy Nancy.Hosting.Aspnet Nancy.ViewEngines.Razor 继续 ...

随机推荐

  1. 20155304 2016-2017-2 《Java程序设计》第六周学习总结

    20155304 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 第十章 串流设计的概念 无论来源和目的地实体形式是什么,只要取得InputStream和Ou ...

  2. 回答: 2017-03-19的关于css+div布局的疑问 2017-04-05

    原问题为红色,回答为黑色 第一次布局一个静态网页,发现许多细节都需要自己探索,出现诸如以下问题: 1.布局问题:经常出现一个div被挤出来?做到一半少一个div布局? 布局之前,要点打好框架,明确每个 ...

  3. 项目的ip地址更改,用git从远程提取代码出现错误,提示为 network error connection timed out

    昨天公司的ip进行了修改,在今天从远程提取代码的过程中提示network error connection timed out错误,从网上看了一下解决方法 1:打开项目文件夹,点击查看 2:勾选隐藏的 ...

  4. 在多个Activity中回传值(startActivityForResult())

    业务逻辑: MainActivity打开A,A打开B,B把值传回MainActivity.适用在多个Activity中回传值. 实例:微信中选择国家-->省份-->城市的实现 实现方式分析 ...

  5. 1.自定义控制器切换<一>

    一.自定义控制器切换:在同一个控制器上,展示不同的控制器,类似于tabbar一样 二.怎么做?(问题解决步骤) 1.创建若干控制器:OneViewController TwoViewControlle ...

  6. C# SMTP发送邮件

    public void SendMail() { MailMessage mail = new MailMessage(); mail.From = new MailAddress("fro ...

  7. Sublime text3 设置的中文翻译

    // While you can edit this file, it's best to put your changes in // "User/Preferences.sublime- ...

  8. 深入浅出数据结构C语言版(8)——后缀表达式、栈与四则运算计算器

    在深入浅出数据结构(7)的末尾,我们提到了栈可以用于实现计算器,并且我们给出了存储表达式的数据结构(结构体及该结构体组成的数组),如下: //SIZE用于多个场合,如栈的大小.表达式数组的大小 #de ...

  9. Druid Indexing 服务

    索引服务由三个主要组件:一个是peon 组件,可以运行一个任务,一个是Middle Managers组件,管理peons,和一个overlord 组件管理任务分发给Middle Managers. o ...

  10. 如何用unity3d实现发送带附件的邮件

    以Gmail为例.点击屏幕的Capture按钮得到当前屏幕截图,点击Send按钮将之前的截图作为附件发送邮件. using UnityEngine; using System.Collections; ...