diff --git a/CombinedResourceManager.cs b/CombinedResourceManager.cs index 473185f..eda457c 100644 --- a/CombinedResourceManager.cs +++ b/CombinedResourceManager.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text.RegularExpressions; -using Autofac.Features.Metadata; -using Orchard.Caching; +using Autofac.Features.Metadata; using Orchard.ContentManagement; // For generic ContentManager methods using Orchard.DisplayManagement.Descriptors; using Orchard.DisplayManagement.Descriptors.ResourceBindingStrategy; @@ -13,12 +9,14 @@ using Orchard.Settings; using Orchard.Themes; using Orchard.UI.Resources; -using Piedone.Combinator.EventHandlers; using Piedone.Combinator.Extensions; using Piedone.Combinator.Models; using Piedone.Combinator.Services; -using System.Linq; using Piedone.HelpfulLibraries.Utilities; +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Threading; namespace Piedone.Combinator { @@ -105,9 +103,21 @@ public override IList BuildRequiredResources(string str IList result; - if (resourceType == ResourceType.Style) result = _combinatorService.CombineStylesheets(resources, settings); - else if (resourceType == ResourceType.JavaScript) result = _combinatorService.CombineScripts(resources, settings); - else return base.BuildRequiredResources(stringResourceType); + using (var mutex = new Mutex(initiallyOwned: false, "Global\\CombinatorFileAccess")) + { + mutex.WaitOne(); + + try + { + if (resourceType == ResourceType.Style) result = _combinatorService.CombineStylesheets(resources, settings); + else if (resourceType == ResourceType.JavaScript) result = _combinatorService.CombineScripts(resources, settings); + else return base.BuildRequiredResources(stringResourceType); + } + finally + { + mutex.ReleaseMutex(); + } + } RemoveOriginalResourceShapes(result, resourceType); diff --git a/Services/CacheFileService.cs b/Services/CacheFileService.cs index 1e42bdb..5194964 100644 --- a/Services/CacheFileService.cs +++ b/Services/CacheFileService.cs @@ -1,22 +1,20 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; +using Autofac; using Orchard; using Orchard.Caching; using Orchard.Data; using Orchard.Environment; using Orchard.Environment.Configuration; using Orchard.Environment.Extensions; -using Orchard.Exceptions; using Orchard.FileSystems.Media; -using Orchard.Mvc; using Orchard.Services; using Piedone.Combinator.EventHandlers; using Piedone.Combinator.Extensions; using Piedone.Combinator.Models; -using Autofac; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; using System.Web.Mvc; namespace Piedone.Combinator.Services @@ -111,11 +109,23 @@ public void Save(string fingerprint, CombinatorResource resource, ICombinatorSet if (_storageProvider.FileExists(path)) _storageProvider.DeleteFile(path); - using (var stream = _storageProvider.CreateFile(path).OpenWrite()) + using (var mutex = new Mutex(initiallyOwned: false, "Global\\CombinatorFileAccess")) { - var bytes = Encoding.UTF8.GetBytes(resource.Content); - stream.Write(bytes, 0, bytes.Length); - } + mutex.WaitOne(); + + try + { + using (var stream = _storageProvider.CreateFile(path).OpenWrite()) + { + var bytes = Encoding.UTF8.GetBytes(resource.Content); + stream.Write(bytes, 0, bytes.Length); + } + } + finally + { + mutex.ReleaseMutex(); + } + } if (!resource.IsRemoteStorageResource) { @@ -134,11 +144,23 @@ public void Save(string fingerprint, CombinatorResource resource, ICombinatorSet var relativeUrlsBaseUri = settings.ResourceBaseUri != null ? settings.ResourceBaseUri : new Uri(_urlHelper.RequestContext.HttpContext.Request.Url, _urlHelper.Content("~/")); ResourceProcessingService.RegexConvertRelativeUrlsToAbsolute(testResource, relativeUrlsBaseUri); - using (var stream = _storageProvider.CreateFile(path).OpenWrite()) + using (var mutex = new Mutex(initiallyOwned: false, "Global\\CombinatorFileAccess")) { - var bytes = Encoding.UTF8.GetBytes(testResource.Content); - stream.Write(bytes, 0, bytes.Length); - } + mutex.WaitOne(); + + try + { + using (var stream = _storageProvider.CreateFile(path).OpenWrite()) + { + var bytes = Encoding.UTF8.GetBytes(testResource.Content); + stream.Write(bytes, 0, bytes.Length); + } + } + finally + { + mutex.ReleaseMutex(); + } + } resource.IsRemoteStorageResource = true; fileRecord.Settings = _combinatorResourceManager.SerializeResourceSettings(resource); @@ -238,9 +260,22 @@ public void WriteSpriteStream(string fileName, SpriteStreamWriter streamWriter) if (_storageProvider.FileExists(path)) _storageProvider.DeleteFile(path); var spriteFile = _storageProvider.CreateFile(path); var publicUrl = _storageProvider.GetPublicUrl(path); - using (var stream = spriteFile.OpenWrite()) + + using (var mutex = new Mutex(initiallyOwned: false, "Global\\CombinatorFileAccess")) { - streamWriter(stream, publicUrl); + mutex.WaitOne(); + + try + { + using (var stream = spriteFile.OpenWrite()) + { + streamWriter(stream, publicUrl); + } + } + finally + { + mutex.ReleaseMutex(); + } } }