Deferred insertion of CaptureStream to improve memory performance.

This commit is contained in:
Daniel Stolt
2015-03-19 12:46:50 +01:00
parent c9cfb8639c
commit 017a101069

View File

@@ -165,9 +165,7 @@ namespace Orchard.OutputCache.Filters {
} }
public void OnResultExecuted(ResultExecutedContext filterContext) { public void OnResultExecuted(ResultExecutedContext filterContext) {
var response = filterContext.HttpContext.Response; if (!_isCachingRequest)
var captureStream = response.Filter as CaptureStream;
if (!_isCachingRequest || captureStream == null)
return; return;
try { try {
@@ -197,6 +195,10 @@ namespace Orchard.OutputCache.Filters {
// Include each content item ID as tags for the cache entry. // Include each content item ID as tags for the cache entry.
var contentItemIds = _displayedContentItemHandler.GetDisplayed().Select(x => x.ToString(CultureInfo.InvariantCulture)).ToArray(); var contentItemIds = _displayedContentItemHandler.GetDisplayed().Select(x => x.ToString(CultureInfo.InvariantCulture)).ToArray();
// Capture the response output using a custom filter stream.
var response = filterContext.HttpContext.Response;
var captureStream = new CaptureStream(response.Filter);
response.Filter = captureStream;
captureStream.Captured += (content) => { captureStream.Captured += (content) => {
try { try {
var cacheItem = new CacheItem() { var cacheItem = new CacheItem() {
@@ -462,8 +464,7 @@ namespace Orchard.OutputCache.Filters {
ApplyCacheControl(response); ApplyCacheControl(response);
// Intercept the rendered response output. // Remember that we should intercept the rendered response output.
response.Filter = new CaptureStream(response.Filter);
_isCachingRequest = true; _isCachingRequest = true;
} }
@@ -566,17 +567,4 @@ namespace Orchard.OutputCache.Filters {
public class ViewDataContainer : IViewDataContainer { public class ViewDataContainer : IViewDataContainer {
public ViewDataDictionary ViewData { get; set; } public ViewDataDictionary ViewData { get; set; }
} }
public sealed class StringWriterWithEncoding : StringWriter {
private readonly Encoding encoding;
public StringWriterWithEncoding(Encoding encoding, IFormatProvider formatProvider)
: base(formatProvider) {
this.encoding = encoding;
}
public override Encoding Encoding {
get { return encoding; }
}
}
} }