Простой ответ - нет, это невозможно. Также обратите внимание, что HttpContext не наследуется от HttpContextBase, вместо этого они оба реализуют IServiceProvider. Наконец, HttpContext запечатан, предполагая, что авторы не хотели, чтобы люди делали что-либо кроме использования этого класса.
Поскольку вы, несомненно, раздражены тем, что HttpContextBase имеет конструктор без параметров, поэтому он даже не дает вам возможности создать его экземпляр из текущего запроса и ответа, такого как HttpContext!
Давайте используем 'декомпилятор' , чтобы взглянуть на реализацию HttpContext.Current:
// System.Web.HttpContext
/// <summary>Gets or sets the <see cref="T:System.Web.HttpContext" /> object for the current HTTP request.</summary>
/// <returns>The <see cref="T:System.Web.HttpContext" /> for the current HTTP request.</returns>
public static HttpContext Current
{
get
{
return ContextBase.Current as HttpContext;
}
set
{
ContextBase.Current = value;
}
}
Если мы посмотрим на ContextBase.Current (из System.Web.Hosting.ContextBase):
// System.Web.Hosting.ContextBase
internal static object Current
{
get
{
return CallContext.HostContext;
}
[SecurityPermission(SecurityAction.Demand, Unrestricted = true)]
set
{
CallContext.HostContext = value;
}
}
и CallContext (в System.Runtime.Messaging):
// System.Runtime.Remoting.Messaging.CallContext
/// <summary>Gets or sets the host context associated with the current thread.</summary>
/// <returns>The host context associated with the current thread.</returns>
/// <exception cref="T:System.Security.SecurityException">The immediate caller does not have infrastructure permission. </exception>
public static object HostContext
{
[SecurityCritical]
get
{
IllogicalCallContext illogicalCallContext = Thread.CurrentThread.GetIllogicalCallContext();
object hostContext = illogicalCallContext.HostContext;
if (hostContext == null)
{
LogicalCallContext logicalCallContext = CallContext.GetLogicalCallContext();
hostContext = logicalCallContext.HostContext;
}
return hostContext;
}
[SecurityCritical]
set
{
if (value is ILogicalThreadAffinative)
{
IllogicalCallContext illogicalCallContext = Thread.CurrentThread.GetIllogicalCallContext();
illogicalCallContext.HostContext = null;
LogicalCallContext logicalCallContext = CallContext.GetLogicalCallContext();
logicalCallContext.HostContext = value;
return;
}
LogicalCallContext logicalCallContext2 = CallContext.GetLogicalCallContext();
logicalCallContext2.HostContext = null;
IllogicalCallContext illogicalCallContext2 = Thread.CurrentThread.GetIllogicalCallContext();
illogicalCallContext2.HostContext = value;
}
}
Мы начинаем понимать, как извлекается HttpContext. Он упакован с темой, которую начал текущий пользователь, когда они заходили на сайт (что имеет смысл!). Далее мы можем увидеть, что он также воссоздается по запросу (см. Ниже).
Мы также видим, что на уровне интерфейса HttpContext.Current нельзя изменить так, чтобы он указывал на ваш собственный HttpContext, поскольку свойство не является виртуальным. Он также использует множество классов BCL, которые являются частными или внутренними, поэтому вы не можете просто скопировать большую часть реализации.
Что было бы проще и менее подвержено любым другим проблемам, так это просто обернуть HttpContext вашим собственным объектом CustomContext. Вы можете просто обернуть HttpContext.Current в свойство BaseContext, а затем иметь свои собственные свойства в классе (и использовать любой механизм хранения состояния на основе сеанса, базы данных или запроса, который вы хотите сохранить и получить свои собственные свойства).
Лично я бы использовал свой собственный класс для хранения своей собственной информации, так как она принадлежит моему приложению, пользователю и т. Д. И не имеет ничего общего с http-конвейером или обработкой запроса / ответа.
Смотри также: