From 954c34b6e0cd6a11ac47d57d6d58fea6cd86469c Mon Sep 17 00:00:00 2001 From: "Valeriano A.R" Date: Sat, 17 Mar 2018 19:54:58 +0100 Subject: [PATCH] Better handling of static files. --- VAR.Focus.Web/Code/Bundler.cs | 9 --- VAR.Focus.Web/Code/ExtensionMethods.cs | 12 +++- VAR.Focus.Web/Code/ScriptsBundler.cs | 2 +- VAR.Focus.Web/Code/StaticFileHelper.cs | 94 ++++++++++++++++++++++++++ VAR.Focus.Web/Code/StylesBundler.cs | 2 +- VAR.Focus.Web/GlobalRouter.cs | 6 +- VAR.Focus.Web/VAR.Focus.Web.csproj | 1 + 7 files changed, 109 insertions(+), 17 deletions(-) create mode 100644 VAR.Focus.Web/Code/StaticFileHelper.cs diff --git a/VAR.Focus.Web/Code/Bundler.cs b/VAR.Focus.Web/Code/Bundler.cs index 3f026c2..1d9118c 100644 --- a/VAR.Focus.Web/Code/Bundler.cs +++ b/VAR.Focus.Web/Code/Bundler.cs @@ -61,15 +61,6 @@ namespace VAR.Focus.Web.Code } } - public void PrepareCacheableResponse(HttpResponse response) - { - const int secondsInDay = 86400; - response.ExpiresAbsolute = DateTime.Now.AddSeconds(secondsInDay); - response.Expires = secondsInDay; - response.Cache.SetCacheability(HttpCacheability.Public); - response.Cache.SetMaxAge(new TimeSpan(0, 0, secondsInDay)); - } - #endregion Public methods } } \ No newline at end of file diff --git a/VAR.Focus.Web/Code/ExtensionMethods.cs b/VAR.Focus.Web/Code/ExtensionMethods.cs index cf895e5..81bca55 100644 --- a/VAR.Focus.Web/Code/ExtensionMethods.cs +++ b/VAR.Focus.Web/Code/ExtensionMethods.cs @@ -1,4 +1,5 @@ -using System.Web; +using System; +using System.Web; using VAR.Json; namespace VAR.Focus.Web.Code @@ -27,6 +28,15 @@ namespace VAR.Focus.Web.Code context.Response.Write(strObject); } + public static void PrepareCacheableResponse(this HttpResponse response) + { + const int secondsInDay = 86400; + response.ExpiresAbsolute = DateTime.Now.AddSeconds(secondsInDay); + response.Expires = secondsInDay; + response.Cache.SetCacheability(HttpCacheability.Public); + response.Cache.SetMaxAge(new TimeSpan(0, 0, secondsInDay)); + } + #endregion HttpContext } } \ No newline at end of file diff --git a/VAR.Focus.Web/Code/ScriptsBundler.cs b/VAR.Focus.Web/Code/ScriptsBundler.cs index 7f8a35c..4dbbf88 100644 --- a/VAR.Focus.Web/Code/ScriptsBundler.cs +++ b/VAR.Focus.Web/Code/ScriptsBundler.cs @@ -12,7 +12,7 @@ namespace VAR.Focus.Web.Code public void ProcessRequest(HttpContext context) { Bundler bundler = new Bundler(context.Server.MapPath("~/Scripts/")); - bundler.PrepareCacheableResponse(context.Response); + context.Response.PrepareCacheableResponse(); bundler.WriteResponse(context.Response, "text/javascript"); } diff --git a/VAR.Focus.Web/Code/StaticFileHelper.cs b/VAR.Focus.Web/Code/StaticFileHelper.cs new file mode 100644 index 0000000..465829e --- /dev/null +++ b/VAR.Focus.Web/Code/StaticFileHelper.cs @@ -0,0 +1,94 @@ +using System.Collections.Generic; +using System.IO; +using System.Web; + +namespace VAR.Focus.Web.Code +{ + public class StaticFileHelper + { + private static Dictionary _mimeTypeByExtension = new Dictionary { {".aac", "audio/aac"}, + {".abw", "application/x-abiword"}, + {".arc", "application/octet-stream"}, + {".avi", "video/x-msvideo"}, + {".azw", "application/vnd.amazon.ebook"}, + {".bin", "application/octet-stream"}, + {".bz", "application/x-bzip"}, + {".bz2", "application/x-bzip2"}, + {".csh", "application/x-csh"}, + {".css", "text/css"}, + {".csv", "text/csv"}, + {".doc", "application/msword"}, + {".epub", "application/epub+zip"}, + {".gif", "image/gif"}, + {".htm", "text/html"}, + {".html", "text/html"}, + {".ico", "image/x-icon"}, + {".ics", "text/calendar"}, + {".jar", "application/java-archive"}, + {".jpg", "image/jpeg"}, + {".jpeg", "image/jpeg"}, + {".js", "application/javascript"}, + {".json", "application/json"}, + {".mid", "audio/midi"}, + {".midi", "audio/midi"}, + {".mpeg", "video/mpeg"}, + {".mpkg", "application/vnd.apple.installer+xml"}, + {".odp", "application/vnd.oasis.opendocument.presentation"}, + {".ods", "application/vnd.oasis.opendocument.spreadsheet"}, + {".odt", "application/vnd.oasis.opendocument.text"}, + {".oga", "audio/ogg"}, + {".ogv", "video/ogg"}, + {".ogx", "application/ogg"}, + {".png", "image/png"}, + {".pdf", "application/pdf"}, + {".ppt", "application/vnd.ms-powerpoint"}, + {".rar", "application/x-rar-compressed"}, + {".rtf", "application/rtf"}, + {".sh", "application/x-sh"}, + {".svg", "image/svg+xml"}, + {".swf", "application/x-shockwave-flash"}, + {".tar", "application/x-tar"}, + {".tiff", "image/tiff"}, + {".tif", "image/tiff"}, + {".ttf", "font/ttf"}, + {".vsd", "application/vnd.visio"}, + {".wav", "audio/x-wav"}, + {".weba", "audio/webm"}, + {".webm", "video/webm"}, + {".webp", "image/webp"}, + {".woff", "font/woff"}, + {".woff2", "font/woff2"}, + {".xhtml", "application/xhtml+xml"}, + {".xls", "application/vnd.ms-excel"}, + {".xml", "application/xml"}, + {".xul", "application/vnd.mozilla.xul+xml"}, + {".zip", "application/zip"}, + {".7z", "application/x-7z-compressed"}, + }; + + public static void ResponseStaticFile(HttpContext context, string filePath) + { + string extension = Path.GetExtension(filePath).ToLower(); + string contentType = null; + if (_mimeTypeByExtension.ContainsKey(extension)) + { + contentType = _mimeTypeByExtension[extension]; + } + + context.Response.Clear(); + + if (string.IsNullOrEmpty(contentType) == false) + { + context.Response.ContentType = contentType; + } + context.Response.PrepareCacheableResponse(); + + context.Response.Buffer = true; + context.Response.WriteFile(filePath); + context.Response.Flush(); + context.Response.Close(); + context.Response.End(); + } + + } +} \ No newline at end of file diff --git a/VAR.Focus.Web/Code/StylesBundler.cs b/VAR.Focus.Web/Code/StylesBundler.cs index 197a772..94c3613 100644 --- a/VAR.Focus.Web/Code/StylesBundler.cs +++ b/VAR.Focus.Web/Code/StylesBundler.cs @@ -12,7 +12,7 @@ namespace VAR.Focus.Web.Code public void ProcessRequest(HttpContext context) { Bundler bundler = new Bundler(context.Server.MapPath("~/Styles/")); - bundler.PrepareCacheableResponse(context.Response); + context.Response.PrepareCacheableResponse(); bundler.WriteResponse(context.Response, "text/css"); } diff --git a/VAR.Focus.Web/GlobalRouter.cs b/VAR.Focus.Web/GlobalRouter.cs index bd34560..f5b3051 100644 --- a/VAR.Focus.Web/GlobalRouter.cs +++ b/VAR.Focus.Web/GlobalRouter.cs @@ -122,11 +122,7 @@ namespace VAR.Focus.Web string filePath = context.Server.MapPath(string.Format("~/{0}", context.Request.FilePath)); if (File.Exists(filePath)) { - context.Response.Buffer = true; - context.Response.WriteFile(filePath); - context.Response.Flush(); - context.Response.Close(); - context.Response.End(); + StaticFileHelper.ResponseStaticFile(context, filePath); return; } } diff --git a/VAR.Focus.Web/VAR.Focus.Web.csproj b/VAR.Focus.Web/VAR.Focus.Web.csproj index ea3ed2a..3b33221 100644 --- a/VAR.Focus.Web/VAR.Focus.Web.csproj +++ b/VAR.Focus.Web/VAR.Focus.Web.csproj @@ -81,6 +81,7 @@ +