Skip to content
Asyncronous caching for Nancy
C# Boo Shell
Latest commit 3d668eb Nov 21, 2014 @creamdog update to Nancy 0.23.2.0

README.md

Nancy.LightningCache

Delivers dynamic content with the speed of static content using asyncronous caching. Nancy.LightningCache will allways deliver cached responses if they exist and update asynchronously if needed.

Installation

Install via nuget https://nuget.org/packages/Nancy.LightningCache

PM> Install-Package Nancy.LightningCache

Or build from source and drop Nancy.LightningCache.dll into your solution

Example usage

the following example is using the default "System.Web.Cache" CacheStore

1. Add to your bootstrapper

using Nancy.LightningCache.Extensions;
using Nancy.Routing;

namespace Asp.Net.Example
{
    public class ApplicationBootrapper : Nancy.DefaultNancyBootstrapper
    {
        protected override void ApplicationStartup(Nancy.TinyIoc.TinyIoCContainer container, Nancy.Bootstrapper.IPipelines pipelines)
        {
            base.ApplicationStartup(container, pipelines);
            /*enable lightningcache, vary by url params id,query,take and skip*/
            this.EnableLightningCache(container.Resolve<IRouteResolver>(), ApplicationPipelines, new[] { "id", "query", "take", "skip" });
        }
    }
}

2. Enable caching by adding "AsCacheable" to any of your routes

using System;
using Nancy;
using Nancy.LightningCache.Extensions;

namespace Asp.Net.Example
{
    public class ExampleModule : NancyModule
    {
        public ExampleModule()
        {
            Get["/"] = _ =>
            {
                /*cache view*/
                return View["hello.html"].AsCacheable(DateTime.Now.AddSeconds(30));
            };

            Get["/CachedResponse"] = _ =>
            {
                /*cache response*/
                return Response.AsText("hello").AsCacheable(DateTime.Now.AddSeconds(30));
            };
        }
    }
}

Example usage of the DiskCacheStore

If your application does not have access to "System.Web.Cache" as in running in self hosting mode you can use the DiskCacheStore to enable caching thought LightningCache.

using Nancy.LightningCache.CacheStore;
using Nancy.LightningCache.Extensions;
using Nancy.Routing;

namespace Asp.Net.Example
{
    public class ApplicationBootrapper : Nancy.DefaultNancyBootstrapper
    {
        protected override void ApplicationStartup(Nancy.TinyIoc.TinyIoCContainer container, Nancy.Bootstrapper.IPipelines pipelines)
        {
            base.ApplicationStartup(container, pipelines);
            /*enable lightningcache using the DiskCacheStore, vary by url params id,query,take and skip*/
            this.EnableLightningCache(container.Resolve<IRouteResolver>(), ApplicationPipelines, new[] { "id", "query", "take", "skip" }, new DiskCacheStore("c:/tmp/cache"));
        }
    }
}

Example definining your own cache key generation using ICacheKeyGenerator

using System;
using System.Text;
using Nancy;
using Nancy.LightningCache.Extensions;
using Nancy.Routing;

namespace WebApplication
{
    public class Bootstrapper : Nancy.DefaultNancyBootstrapper
    {
        protected override void ApplicationStartup(Nancy.TinyIoc.TinyIoCContainer container, Nancy.Bootstrapper.IPipelines pipelines)
        {
            base.ApplicationStartup(container, pipelines);
            this.EnableLightningCache(container.Resolve<IRouteResolver>(), ApplicationPipelines, new UrlHashKeyGenerator());
        }

        public class UrlHashKeyGenerator : Nancy.LightningCache.CacheKey.ICacheKeyGenerator
        {
            public string Get(Request request)
            {
               using(var md5 = new System.Security.Cryptography.MD5CryptoServiceProvider())
               {
                   var hash = md5.ComputeHash(Encoding.UTF8.GetBytes(request.Url.ToString()));
                   return Convert.ToBase64String(hash);
               }
            }
        }
    }
}
Something went wrong with that request. Please try again.