sevenate / fab

Client-server application for tracking and planning family assets
2 stars 0 forks source link

FEA - Optimize xap caching #96

Closed sevenate closed 12 years ago

sevenate commented 12 years ago

Original report by sevenate (Bitbucket: sevenate, GitHub: sevenate).


Create a custom http handler for handling *.xap files and then set your caching options inside the handler:

#!c#

using System;
using System.IO;
using System.Web;

public class FileCacheHandler : IHttpHandler
{
    public virtual void ProcessRequest(HttpContext context)
    {
        if (File.Exists(context.Request.PhysicalPath))
        {
            DateTime lastWriteTime = File.GetLastWriteTime(filePath);
            DateTime? modifiedSinceHeader = GetModifiedSinceHeader(context.Request);

            if (modifiedSinceHeader == null || lastWriteTime > modifiedSinceHeader)
            {
                context.Response.AddFileDependency(filePath);
                context.Response.Cache.SetLastModifiedFromFileDependencies();
                context.Response.Cache.SetCacheability(HttpCacheability.Public);
                context.Response.TransmitFile(filePath);
                context.Response.StatusCode = 200;
                context.Response.ContentType = "application/x-silverlight-app";
                context.Response.OutputStream.Flush();
            }
            else
            {
                context.Response.StatusCode = 304;
            }
        }
    }

    public DateTime? GetModifiedSinceHeader(HttpRequest request)
    {
        string modifiedSinceHeader = request.Headers["If-Modified-Since"];
        DateTime modifiedSince;
        if (string.IsNullOrEmpty(modifiedSinceHeader)
          || modifiedSinceHeader.Length == 0
          || !DateTime.TryParse(modifiedSinceHeader, out modifiedSince))
            return null;

        return modifiedSince;
    }
}
sevenate commented 12 years ago

Original comment by sevenate (Bitbucket: sevenate, GitHub: sevenate).


See [[https://bitbucket.org/sevenate/fab/changeset/e2cf5fd84ce6|e2cf5fd84ce6]]