diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/DatabaseOutputCacheMigrations.cs b/src/Orchard.Web/Modules/Orchard.OutputCache/DatabaseOutputCacheMigrations.cs index b2cadf867..19b439882 100644 --- a/src/Orchard.Web/Modules/Orchard.OutputCache/DatabaseOutputCacheMigrations.cs +++ b/src/Orchard.Web/Modules/Orchard.OutputCache/DatabaseOutputCacheMigrations.cs @@ -16,7 +16,7 @@ namespace Contrib.Cache.Database { .Column("GraceTime", c => c.Nullable()) .Column("ValidUntilUtc") .Column("StoredUntilUtc") - .Column("Output", column => column.Unlimited()) + .Column("Output", column => column.Unlimited().WithType(DbType.Binary)) .Column("ContentType") .Column("QueryString", column => column.WithLength(2048)) .Column("CacheKey", column => column.WithLength(2048)) @@ -31,7 +31,7 @@ namespace Contrib.Cache.Database { .CreateIndex("IDX_CacheItemRecord_CacheKey", "CacheKey") ); - return 2; + return 3; } public int UpdateFrom1() { @@ -45,5 +45,14 @@ namespace Contrib.Cache.Database { return 2; } + + public int UpdateFrom2() { + SchemaBuilder.AlterTable("CacheItemRecord", + table => { + table.AlterColumn("Output", c => c.Unlimited().WithType(DbType.Binary)); + }); + + return 3; + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/CaptureStream.cs b/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/CaptureStream.cs index fc40168c0..3f2c3addd 100644 --- a/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/CaptureStream.cs +++ b/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/CaptureStream.cs @@ -7,14 +7,12 @@ using System.Web; namespace Orchard.OutputCache.Filters { public class CaptureStream : Stream { - public CaptureStream(Stream innerStream, Encoding encoding) { + public CaptureStream(Stream innerStream) { _innerStream = innerStream; - _encoding = encoding; _captureStream = new MemoryStream(); } private readonly Stream _innerStream; - private readonly Encoding _encoding; private readonly MemoryStream _captureStream; public override bool CanRead { @@ -64,15 +62,14 @@ namespace Orchard.OutputCache.Filters { } public override void Write(byte[] buffer, int offset, int count) { - _captureStream.Write(buffer, 0, count); - _innerStream.Write(buffer, offset, buffer.Length); + _captureStream.Write(buffer, offset, count); + _innerStream.Write(buffer, offset, count); } - public event Action Captured; + public event Action Captured; protected virtual void OnCaptured() { - var content = _encoding.GetString(_captureStream.ToArray()); - Captured(content); + Captured(_captureStream.ToArray()); } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs b/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs index 276a1a937..1a610e361 100644 --- a/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs +++ b/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs @@ -197,15 +197,15 @@ namespace Orchard.OutputCache.Filters { // Capture the response output using a custom filter stream. var response = filterContext.HttpContext.Response; - var captureStream = new CaptureStream(response.Filter, response.Output.Encoding); + var captureStream = new CaptureStream(response.Filter); response.Filter = captureStream; - captureStream.Captured += (content) => { + captureStream.Captured += (output) => { try { var cacheItem = new CacheItem() { CachedOnUtc = _now, Duration = cacheDuration, GraceTime = cacheGraceTime, - Output = content, + Output = output, ContentType = response.ContentType, QueryString = filterContext.HttpContext.Request.Url.Query, CacheKey = _cacheKey, @@ -439,7 +439,6 @@ namespace Orchard.OutputCache.Filters { private void ServeCachedItem(ActionExecutingContext filterContext, CacheItem cacheItem) { var response = filterContext.HttpContext.Response; - var output = cacheItem.Output; // Adds some caching information to the output if requested. if (CacheSettings.DebugMode) { @@ -448,10 +447,7 @@ namespace Orchard.OutputCache.Filters { } // Shorcut action execution. - filterContext.Result = new ContentResult { - Content = output, - ContentType = cacheItem.ContentType - }; + filterContext.Result = new FileContentResult(cacheItem.Output, cacheItem.ContentType); response.StatusCode = cacheItem.StatusCode; diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/Models/CacheItem.cs b/src/Orchard.Web/Modules/Orchard.OutputCache/Models/CacheItem.cs index ce111c219..dd0c1d0b3 100644 --- a/src/Orchard.Web/Modules/Orchard.OutputCache/Models/CacheItem.cs +++ b/src/Orchard.Web/Modules/Orchard.OutputCache/Models/CacheItem.cs @@ -6,7 +6,7 @@ namespace Orchard.OutputCache.Models { public DateTime CachedOnUtc { get; set; } public int Duration { get; set; } public int GraceTime { get; set; } - public string Output { get; set; } + public byte[] Output { get; set; } public string ContentType { get; set; } public string QueryString { get; set; } public string CacheKey { get; set; } diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/Models/CacheItemRecord.cs b/src/Orchard.Web/Modules/Orchard.OutputCache/Models/CacheItemRecord.cs index 6894f266c..6cd345e8b 100644 --- a/src/Orchard.Web/Modules/Orchard.OutputCache/Models/CacheItemRecord.cs +++ b/src/Orchard.Web/Modules/Orchard.OutputCache/Models/CacheItemRecord.cs @@ -12,7 +12,7 @@ namespace Orchard.OutputCache.Models { public virtual int GraceTime { get; set; } public virtual DateTime ValidUntilUtc { get; set; } public virtual DateTime StoredUntilUtc { get; set; } - [StringLengthMax] public virtual string Output { get; set; } + public virtual byte[] Output { get; set; } public virtual string ContentType { get; set; } [StringLength(2048)] public virtual string QueryString { get; set; } [StringLength(2048)] public virtual string CacheKey { get; set; }