如何初始化自定义HTTP上下文或HttpContextBase想不通一件事是如何初始化基类System.Web.HttpContext.Current有没有人知道我如何首先使用CurrentHttp初始化自定义上下文,然后为了我自己的目的覆盖某些方法/属性?简短的回答是否定的,这是不可能的。另请注意,HttpContext不继承自HttpContextBase,而是它们都实现了IServiceProvider。最后,HttpContext是密封的,这表明作者不希望人们除了消费这个类之外做任何事情。毫无疑问HttpContextBase有一个无参数的构造函数,所以甚至没有给你从当前请求和响应中实例化它的选项,就像HttpContext!让我们使用“反编译器”看一下HttpContext.Current的实现://System.Web.HttpContext///获取或设置当前HTTP请求的对象。///用于当前的HTTP请求。publicstaticHttpContextCurrent{get{returnContextBase.CurrentasHttpContext;}set{ContextBase.Current=value;如果我们查看ContextBase.Current(来自System.Web.Hosting.ContextBase)://System.Web.Hosting.ContextBase内部静态对象Current{get{returnCallContext.HostContext;}[SecurityPermission(SecurityAction.Demand,Unrestricted=true)]set{CallContext.HostContext=value;}}和CallContext(在System.Runtime.Messaging中)://System.Runtime.Remoting.Messaging.CallContext///获取或设置与当前线程关联的主机上下文。///与当前线程关联的主机上下文。///直接调用者没有基础设施权限。公共静态对象HostContext{[SecurityCritical]get{IllogicalCallContextillogicalCallContext=Thread.CurrentThread.GetIllogicalCallContext();对象hostContext=illogicalCallContext.HostContext;if(hostContext==null){LogicalCallContextlogicalCallContext=CallContext.GetLogicalCallContext();hostContext=logicalCallContext.HostContext;}返回主机上下文;}[SecurityCritical]set{if(值为ILogicalThreadAffinative){IllogicalCallContextillogicalCallContext=Thread.CurrentThread.GetIllogicalCallContext();illogicalCallContext.HostContext=null;LogicalCallContextlogicalCallContext=CallContext.GetLogicalCallContext();logicalCallContext.HostContext=值;返回;}LogicalCallContextlogicalCallContext2=CallContext.GetLogicalCallContext();logicalCallContext2.HostContext=null;IllogicalCallContextillogicalCallContext2=Thread.CurrentThread.GetIllogicalCallContext();illogicalCallContext2.HostContext=值;我们开始了解如何检查Http上下文它打包了当前用户访问该站点时启动的线程(这非常有意义!)。进一步调查我们可以看到它也是根据要求重新创建的(见下文)。我们也可以看到,在接口层,HttpContext.Current是不能改成指向你自己的HttpContext的,因为这个属性不是virtual的。它还使用许多私有或内部BCL类,因此您不能简单地复制大部分实现。更简单且不易出现任何其他问题的方法是简单地用您自己的CustomContext对象包装HttpContext。您可以简单地将HttpContext.Current包装在BaseContext属性中,然后在该类上拥有您自己的属性(并使用您想要存储和检索您自己的属性的任何基于会话、数据库或请求的状态存储机制)。就个人而言,我会使用我自己的类来存储我自己的信息,因为它属于我的应用程序和用户等,与http管道或请求/响应处理没有任何关系。另请参阅:只是为了添加一点破折号的答案,您还可以将[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#学习教程,希望大家多多关注。本文来自网络合集。不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
