gpt4 book ai didi

c# - 如何初始化自定义 HTTP 上下文或 HttpContextBase

转载 作者:太空狗 更新时间:2023-10-29 22:53:52 26 4
gpt4 key购买 nike

我正在尝试创建自己的自定义 HTTP 上下文:

CustomHttpContext : HttpContextBase
{
public override HttpRequestBase Request { }
}

我不知道的一件事是如何初始化基类

System.Web.HttpContext.Current

有没有人知道我如何首先使用当前 Http 初始化自定义上下文,然后重写某些方法/属性以满足我自己的目的?

最佳答案

简单的回答是否定的,这是不可能的。另请注意,HttpContext 并未继承自 HttpContextBase,相反,它们都实现了 IServiceProvider。最后,HttpContext 是密封的,表明作者不希望人们除了使用这个类之外做任何事情。

毫无疑问,您对 HttpContextBase 有一个无参数构造函数感到恼火,因此甚至没有为您提供从当前请求和响应中实例化它的选项,如 HttpContext!

让我们使用 'decompiler'看一下 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。它被打包在当前用户访问网站时启动的线程中(这非常有意义!)。进一步研究,我们可以看到它也会根据请求重新创建(见下文)。

我们也可以看到,在接口(interface)层,HttpContext.Current不能修改为指向你自己的HttpContext,因为这个属性不是virtual。它还使用许多私有(private)或内部的 BCL 类,因此您不能简单地复制大部分实现。

将 HttpContext 简单地用您自己的 CustomContext 对象包装起来会更容易,也不太容易出现任何其他问题。您可以简单地将 HttpContext.Current 包装在 BaseContext 属性中,然后在该类上拥有您自己的属性(并使用您想要存储和检索您自己的属性的任何基于 session 、数据库或请求的状态存储机制)。

就个人而言,我会使用我自己的类来存储我自己的信息,因为它属于我的应用程序和用户等,与 http 管道或请求/响应处理没有任何关系。

另见:

关于c# - 如何初始化自定义 HTTP 上下文或 HttpContextBase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8701440/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com