diff --git a/src/Orchard/Environment/State/ContextState.cs b/src/Orchard/Environment/State/ContextState.cs
index 8fee2c7e3..70310d3f9 100644
--- a/src/Orchard/Environment/State/ContextState.cs
+++ b/src/Orchard/Environment/State/ContextState.cs
@@ -1,11 +1,12 @@
using System;
-using System.Runtime.Remoting;
using System.Runtime.Remoting.Messaging;
+using System.Web;
+using Orchard.Mvc;
namespace Orchard.Environment.State {
///
- /// Holds some state through the logical call context
+ /// Holds some state for the current HttpContext or thread
///
/// The type of data to store
public class ContextState where T : class {
@@ -22,21 +23,38 @@ namespace Orchard.Environment.State {
}
public T GetState() {
- var handle = CallContext.LogicalGetData(_name) as ObjectHandle;
- var data = handle != null ? handle.Unwrap() : null;
+ if (!HttpContextIsValid()) {
+ var data = CallContext.GetData(_name);
- if (data == null) {
- if (_defaultValue != null) {
- CallContext.LogicalSetData(_name, new ObjectHandle(data = _defaultValue()));
- return data as T;
+ if (data == null) {
+ if (_defaultValue != null) {
+ CallContext.SetData(_name, data = _defaultValue());
+ return data as T;
+ }
}
+
+ return data as T;
}
- return data as T;
+ if (HttpContext.Current.Items[_name] == null) {
+ HttpContext.Current.Items[_name] = _defaultValue == null ? null : _defaultValue();
+ }
+
+ return HttpContext.Current.Items[_name] as T;
+
}
public void SetState(T state) {
- CallContext.LogicalSetData(_name, new ObjectHandle(state));
+ if (!HttpContextIsValid()) {
+ CallContext.SetData(_name, state);
+ }
+ else {
+ HttpContext.Current.Items[_name] = state;
+ }
+ }
+
+ private bool HttpContextIsValid() {
+ return HttpContext.Current != null && !HttpContext.Current.Items.Contains(MvcModule.IsBackgroundHttpContextKey);
}
}
-}
+}
\ No newline at end of file