diff --git a/.gitignore b/.gitignore index 4bdfee989..bb7b6a923 100644 --- a/.gitignore +++ b/.gitignore @@ -186,5 +186,6 @@ src/Orchard.Web/Properties/PublishProfiles src/Orchard.Azure/Orchard.Azure.CloudService/Staging/ #enable all /lib artifacts -!lib/*/*.* +!lib/**/*.* +!src/Orchard.Web/Modules/Orchard.Scripting.CSharp/Lib/*.* */.vs/* diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Scripts/LayoutDesignerHost.js b/src/Orchard.Web/Modules/Orchard.Layouts/Scripts/LayoutDesignerHost.js index b4a68a445..4e7fa00e4 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Scripts/LayoutDesignerHost.js +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Scripts/LayoutDesignerHost.js @@ -1,9 +1,9 @@ (function ($) { - var LayoutDesignerHost = function (element) { + var LayoutDesignerHost = function (element, layoutEditor) { var self = this; this.element = element; this.element.data("layout-designer-host", this); - this.editor = window.layoutEditor; + this.editor = layoutEditor; this.settings = { antiForgeryToken: self.element.data("anti-forgery-token"), editorDialogTitleFormat: self.element.data("editor-dialog-title-format"), @@ -124,20 +124,6 @@ // Export types. window.Orchard = window.Orchard || {}; window.Orchard.Layouts = window.Orchard.Layouts || {}; - window.Orchard.Layouts.LayoutEditorHost = window.Orchard.Layouts.LayoutEditorHost || {}; + window.Orchard.Layouts.LayoutDesignerHost = LayoutDesignerHost; - $(function () { - window.layoutDesignerHost = new LayoutDesignerHost($(".layout-designer")); - $(".layout-designer").each(function (e) { - var designer = $(this); - var dialog = designer.find(".layout-editor-help-dialog"); - designer.find(".layout-editor-help-link").click(function (e) { - dialog.dialog({ - modal: true, - width: 840 - }); - e.preventDefault(); - }); - }); - }); })(jQuery); \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Views/EditorTemplates/LayoutEditor.cshtml b/src/Orchard.Web/Modules/Orchard.Layouts/Views/EditorTemplates/LayoutEditor.cshtml index 6aecbbc95..c83465d73 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Views/EditorTemplates/LayoutEditor.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Views/EditorTemplates/LayoutEditor.cshtml @@ -38,8 +38,20 @@ jQuery(function () { var editorConfig = JSON.parse(LayoutEditor.decode("@Html.Raw(Url.Encode(Model.ConfigurationData))")); var editorCanvasData = JSON.parse(LayoutEditor.decode("@Html.Raw(Url.Encode(Model.Data))")); + var layoutEditor = window.layoutEditor = new LayoutEditor.Editor(editorConfig, editorCanvasData); - window.layoutEditor = new LayoutEditor.Editor(editorConfig, editorCanvasData); + var host = new window.Orchard.Layouts.LayoutDesignerHost($(".layout-designer"), layoutEditor); + $(".layout-designer").each(function (e) { + var designer = $(this); + var dialog = designer.find(".layout-editor-help-dialog"); + designer.find(".layout-editor-help-link").click(function (e) { + dialog.dialog({ + modal: true, + width: 840 + }); + e.preventDefault(); + }); + }); }); } diff --git a/src/Orchard.Web/Modules/Orchard.Redis/Caching/RedisCacheStorageProvider.cs b/src/Orchard.Web/Modules/Orchard.Redis/Caching/RedisCacheStorageProvider.cs index 87a83c423..722a70437 100644 --- a/src/Orchard.Web/Modules/Orchard.Redis/Caching/RedisCacheStorageProvider.cs +++ b/src/Orchard.Web/Modules/Orchard.Redis/Caching/RedisCacheStorageProvider.cs @@ -54,7 +54,7 @@ namespace Orchard.Redis.Caching { } public void Remove(string key) { - Database.KeyDelete(key); + Database.KeyDelete(GetLocalizedKey(key)); } public void Clear() { diff --git a/src/Orchard/Localization/LocalizedString.cs b/src/Orchard/Localization/LocalizedString.cs index 2b7024416..60bddd38b 100644 --- a/src/Orchard/Localization/LocalizedString.cs +++ b/src/Orchard/Localization/LocalizedString.cs @@ -78,5 +78,9 @@ namespace Orchard.Localization { return string.Equals(_localized, that._localized); } + public override object InitializeLifetimeService() { + // never expire the cross-AppDomain lease on this object + return null; + } } } diff --git a/src/Orchard/Logging/OrchardLog4netLogger.cs b/src/Orchard/Logging/OrchardLog4netLogger.cs index 81b743927..eb2317ce4 100644 --- a/src/Orchard/Logging/OrchardLog4netLogger.cs +++ b/src/Orchard/Logging/OrchardLog4netLogger.cs @@ -421,5 +421,9 @@ namespace Orchard.Logging { } } + public override object InitializeLifetimeService() { + // never expire the cross-AppDomain lease on this object + return null; + } } } diff --git a/src/Tools/Orchard/Host/CommandHost.cs b/src/Tools/Orchard/Host/CommandHost.cs index 818e8aa6a..9ef6e29d6 100644 --- a/src/Tools/Orchard/Host/CommandHost.cs +++ b/src/Tools/Orchard/Host/CommandHost.cs @@ -2,6 +2,8 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Runtime.Remoting; +using System.Runtime.Remoting.Lifetime; using System.Security; using System.Web.Hosting; using Orchard.Parameters; @@ -32,28 +34,46 @@ namespace Orchard.Host { [SecurityCritical] public override object InitializeLifetimeService() { - // never expire the license + // never expire the cross-AppDomain lease on this object return null; } + private static void ExtendLifeTimeLeases(TextReader input, TextWriter output) { + // Orchard objects passed as parameters into this AppDomain should derive from MarshalByRefObject and have + // infinite lease timeouts by means of their InitializeLifetimeService overrides. For the input/output + // stream objects we approximate that behavior by immediately renewing the lease for 30 days. + ExtendLifeTimeLease(input); + ExtendLifeTimeLease(output); + } + + private static void ExtendLifeTimeLease(MarshalByRefObject obj) { + if (RemotingServices.IsObjectOutOfAppDomain(obj)) { + var lease = (ILease)RemotingServices.GetLifetimeService(obj); + lease.Renew(TimeSpan.FromDays(30)); + } + } + [SecuritySafeCritical] void IRegisteredObject.Stop(bool immediate) { HostingEnvironment.UnregisterObject(this); } public CommandReturnCodes StartSession(TextReader input, TextWriter output) { + ExtendLifeTimeLeases(input, output); _agent = CreateAgent(); return StartHost(_agent, input, output); } public void StopSession(TextReader input, TextWriter output) { if (_agent != null) { + ExtendLifeTimeLeases(input, output); StopHost(_agent, input, output); _agent = null; } } public CommandReturnCodes RunCommand(TextReader input, TextWriter output, Logger logger, OrchardParameters args) { + ExtendLifeTimeLeases(input, output); var agent = CreateAgent(); CommandReturnCodes result = (CommandReturnCodes)agent.GetType().GetMethod("RunSingleCommand").Invoke(agent, new object[] { input, @@ -66,6 +86,7 @@ namespace Orchard.Host { } public CommandReturnCodes RunCommandInSession(TextReader input, TextWriter output, Logger logger, OrchardParameters args) { + ExtendLifeTimeLeases(input, output); CommandReturnCodes result = (CommandReturnCodes)_agent.GetType().GetMethod("RunCommand").Invoke(_agent, new object[] { input, output, @@ -77,6 +98,7 @@ namespace Orchard.Host { } public CommandReturnCodes RunCommands(TextReader input, TextWriter output, Logger logger, IEnumerable responseLines) { + ExtendLifeTimeLeases(input, output); var agent = CreateAgent(); CommandReturnCodes result = StartHost(agent, input, output); diff --git a/src/Tools/Orchard/Logger.cs b/src/Tools/Orchard/Logger.cs index 759130101..d45124b6e 100644 --- a/src/Tools/Orchard/Logger.cs +++ b/src/Tools/Orchard/Logger.cs @@ -17,5 +17,10 @@ namespace Orchard { _output.WriteLine(format, args); } } + + public override object InitializeLifetimeService() { + // never expire the cross-AppDomain lease on this object + return null; + } } } diff --git a/src/Tools/Orchard/OrchardParameters.cs b/src/Tools/Orchard/OrchardParameters.cs index 3a5d74785..130c2265b 100644 --- a/src/Tools/Orchard/OrchardParameters.cs +++ b/src/Tools/Orchard/OrchardParameters.cs @@ -10,5 +10,10 @@ namespace Orchard { public IList Arguments { get; set; } public IList ResponseFiles { get; set; } public IDictionary Switches { get; set; } + + public override object InitializeLifetimeService() { + // never expire the cross-AppDomain lease on this object + return null; + } } } \ No newline at end of file diff --git a/src/Tools/Orchard/ResponseFiles/ResponseFileReader.cs b/src/Tools/Orchard/ResponseFiles/ResponseFileReader.cs index bb6a93804..d3329ba63 100644 --- a/src/Tools/Orchard/ResponseFiles/ResponseFileReader.cs +++ b/src/Tools/Orchard/ResponseFiles/ResponseFileReader.cs @@ -10,6 +10,11 @@ namespace Orchard.ResponseFiles { public string LineText { get; set; } public int LineNumber { get; set; } public string[] Args { get; set; } + + public override object InitializeLifetimeService() { + // never expire the cross-AppDomain lease on this object + return null; + } } public class ResponseFileReader {