如何初始化自定义HTTP上下文或HttpContextBase
我正在尝试创建自己的自定义HTTP上下文:
CustomHttpContext : HttpContextBase { public override HttpRequestBase Request { } }
我无法弄清楚的一件事是如何初始化基类
System.Web.HttpContext.Current
有没有人有任何想法我如何首先使用Current Http初始化自定义上下文然后覆盖某些方法/属性以满足我自己的目的?
简单的答案是否定的,这是不可能的。 另请注意,HttpContext不会从HttpContextBaseinheritance,而是它们都实现了IServiceProvider。 最后,HttpContext是密封的,这表明作者不希望人们做任何事情而不是消费这个类。
毫无疑问,HttpContextBase有一个无参数构造函数,所以甚至没有给你从当前请求和响应中实例化它的选项,如HttpContext!
让我们使用’反编译器’来看看HttpContext.Current的实现:
// System.Web.HttpContext /// Gets or sets the object for the current HTTP request. /// The for the current HTTP request. 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 /// Gets or sets the host context associated with the current thread. /// The host context associated with the current thread. /// The immediate caller does not have infrastructure permission. 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类,因此您不能简单地复制大部分实现。
更简单,也更不容易出现任何其他问题的方法是简单地用自己的CustomContext对象包装HttpContext。 您可以简单地将HttpContext.Current包装在BaseContext属性中,然后在类上拥有您自己的属性(并使用您要存储和检索自己的属性的任何基于会话,数据库或请求的状态存储机制)。
就个人而言,我会使用自己的类来存储我自己的信息,因为它属于我的应用程序和用户等,并且与http管道或请求/响应处理没有任何关系。
也可以看看:
只需添加一点到dash的答案,您还可以将[ThreadStatic]属性与一些静态属性一起使用。 在BeginRequest上初始化它,可以使用global.cs,也可以编写自己的HttpModule / HttpHandler。
如何创建Web模块: http : //msdn.microsoft.com/en-us/library/ms227673(v = vs.100).aspx
线程静态: http : //msdn.microsoft.com/en-us/library/system.threadstaticattribute.aspx
上述就是C#学习教程:如何初始化自定义HTTP上下文或HttpContextBase分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1250967.html