Merge pull request #6342 from jtkech/patch-8

#6321: Always use CallContext Logical Data in ContextState.cs
This commit is contained in:
Sébastien Ros
2016-02-18 12:47:42 -08:00

View File

@@ -1,12 +1,11 @@
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Messaging;
using System.Web;
using Orchard.Mvc;
namespace Orchard.Environment.State {
/// <summary>
/// Holds some state for the current HttpContext or thread
/// Holds some state through the logical call context
/// </summary>
/// <typeparam name="T">The type of data to store</typeparam>
public class ContextState<T> where T : class {
@@ -23,38 +22,21 @@ namespace Orchard.Environment.State {
}
public T GetState() {
if (!HttpContextIsValid()) {
var data = CallContext.GetData(_name);
var handle = CallContext.LogicalGetData(_name) as ObjectHandle;
var data = handle != null ? handle.Unwrap() : null;
if (data == null) {
if (_defaultValue != null) {
CallContext.SetData(_name, data = _defaultValue());
return data as T;
}
if (data == null) {
if (_defaultValue != null) {
CallContext.LogicalSetData(_name, new ObjectHandle(data = _defaultValue()));
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;
return data as T;
}
public void SetState(T 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);
CallContext.LogicalSetData(_name, new ObjectHandle(state));
}
}
}
}