仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2653|回复: 12
打印 上一主题 下一主题

[学习教程] ASP.NET网页设计关于在Application_Start中会见Context.Request仓酷云

[复制链接]
谁可相欹 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:20:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
听03很多师兄说主讲老师杭城方讲课很差就连旁听也没有去了)今天埋怨了一下HttpContext的计划,在Global.asax的Application_Start()中会见Context.Request,会激发“Requestisnotavailableinthiscontext”非常(注:程序运转于IIS集成形式)。
有园友辩驳说在Application_Start()中不该该往会见Context.Request。我对这个辩驳的了解就是HttpApplication还没启动好,还没入手下手正式处置哀求,你就猴急着会见Request干嘛?晓得不,这和列队一样,有个先来后到。先有HttpApplication,然后才有Request。
我厥后想一想,不合错误呀!我们公布一个ASP.NET网站时,并没有先接通电源,按一个启动按钮让HttpApplication启动起来,然后翻开年夜门大呼:“HTTP哀求们,能够出去了”。
实践情形是,公布网站以后,最少有一个哀求,程序才会启动,才会有HttpApplication。明显是先有Request,才会有HttpApplication。
并且前一篇文章中,我们的需求是在Application_Start()中猎取以后Request的URL,Application_Start是由Request而生,有Request的中央就有URL,这个需求通情达理啊!
在程序员的天下,我们必要辩驳,我们也必要对辩驳的对抗。
因而,明天把IIS使用程序池改成传统(Classic)形式,持续在Application_Start()中会见Context.Request。事业呈现了!居然能够一般会见Context.Request,拿到想要的Context.Request.Url.AbsoluteUri。这最少申明了,“在Application_Start()中会见Context.Request”的需求是公道的。假如分歧理,那末在传统Classic形式也不该该能会见,不然就是一个自相冲突的计划。
写代码不是争吵,找到例子证实本人的概念就好了。办理成绩大概找到成绩的缘故原由才是霸道。
在前一篇文章中,我们晓得祸首罪魁是HttpContext的HideRequestResponse属性,再拿出来示众一下:
  1. internalboolHideRequestResponse;publicHttpRequestRequest{get{if(this.HideRequestResponse){thrownewHttpException(SR.GetString("Request_not_available"));}returnthis._request;}}
复制代码
既然在IIS集成形式下才会呈现这个非常,那就是在IIS集成形式下,ASP.NETRuntime将HideRequestResponse设置为了true。我们必要找到ASP.NETRuntime在那里干了这个“活动”。这就要借助于.NET天下的侦察新星——ILSpy。
在ILSpy中,选中HttpContext的HideRequestResponse属性,点击“Analyze”,看看谁挪用了HideRequestResponse并修正了它的值,然后一个一个往侦察。。。侦察的历程这里就省略了。。。间接看我们的侦察了局,先看上面的ILSpy截图:

既然我们是在Application_Start办法中挪用Context.Request,那我们起首就要晓得Application_Start是在哪实行。实践就是上图所示的FireApplicationOnStart()办法,反编译出来的代码以下:
  1. //System.Web.HttpApplicationFactoryprivatevoidFireApplicationOnStart(HttpContextcontext){if(this._onStartMethod!=null){HttpApplicationspecialApplicationInstance=this.GetSpecialApplicationInstance();specialApplicationInstance.ProcessSpecialRequest(context,this._onStartMethod,this._onStartParamCount,this,EventArgs.Empty,null);this.RecycleSpecialApplicationInstance(specialApplicationInstance);}}
复制代码
_onStartMethod就是在Global.asax中界说的Application_Start()办法,从下面的代码中能够看出,_onStartMethod是实践在specialApplicationInstance.ProcessSpecialRequest中被实行的,进进ProcessSpecialRequest看个事实,代码以下(代码已精简,...暗示被省略的代码,重点看白色字体部分):
  1. //System.Web.HttpApplicationinternalvoidProcessSpecialRequest(...){this._context=context;if(HttpRuntime.UseIntegratedPipeline&&this._context!=null){this._context.HideRequestResponse=true;}...using(newHttpContextWrapper(context)){using(newApplicationImpersonationContext()){try{//挪用Application_Start()办法method.Invoke(...)...}catch(Exceptionex){...}finally{...if(HttpRuntime.UseIntegratedPipeline&&this._context!=null){this._context.HideRequestResponse=false;}this._hideRequestResponse=false;...}}}}
复制代码
从下面的白色字体部分能够看出,原形就在这里,当运转于IIS集成形式时,HttpRuntime.UseIntegratedPipeline就即是true,然后HttpContext.HideRequestResponse被设置为true,然后实行Application_Start()中的代码,然后就激发“Requestisnotavailableinthiscontext”非常。
这篇文章只是对“Requestisnotavailableinthiscontext”成绩的进一步探究,找出了成绩产生的详细中央。至于为何微软要这么计划?有无举措在Application_Start()中猎取以后哀求的URL?即便不克不及猎取,有无举措避开这个非常?今朝我们不晓得谜底。
无论谁倒了对双方阵营的粉丝们也是有害无益。
小女巫 该用户已被删除
沙发
发表于 2015-1-20 20:51:06 来自手机 | 只看该作者
在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。
小妖女 该用户已被删除
板凳
发表于 2015-1-25 20:22:49 来自手机 | 只看该作者
CGI程序在运行的时候,首先是客户向服务器上的CGI程序发送一个请求,服务器接收到客户的请求后,就会打开一个新的Process(进程)来执行CGI程序,处理客户的请求。CGI程序最后将执行的结果(HTML页面代码)传回给客户。
因胸联盟 该用户已被删除
地板
发表于 2015-1-31 20:27:35 | 只看该作者
ASP.net的速度是ASP不能比拟的。ASP.net是编译语言,所以,当第一次加载的时候,它会把所有的程序进行编译(其中包括worker进程,还有对语法进行编译,形成一个程序集),当程序编译后,执行速度几乎为0。
精灵巫婆 该用户已被删除
5#
发表于 2015-2-1 16:57:31 | 只看该作者
最强的技术支持WebService,而且有.NET的所有library做后盾。而且ASP.NET在.NET3.5中还有微软专门为AJAX开发的功能--ASP.NETAJAX。
不帅 该用户已被删除
6#
发表于 2015-2-3 10:16:13 | 只看该作者
如今主流的Web服务器软件主要由IIS或Apache组成。IIS支持ASP且只能运行在Windows平台下,Apache支持PHP,CGI,JSP且可运行于多种平台,虽然Apache是世界使用排名第一的Web服务器平台。
柔情似水 该用户已被删除
7#
发表于 2015-2-8 20:06:16 | 只看该作者
由于CGI程序每响应一个客户就会打开一个新的进程,所以,当有多个用户同时进行CGI请求的时候,服务器就会打开多个进程,这样就加重了服务器的负担,使服务器的执行效率变得越来越低下。
再现理想 该用户已被删除
8#
发表于 2015-2-12 00:16:46 | 只看该作者
在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。
愤怒的大鸟 该用户已被删除
9#
发表于 2015-2-14 02:11:55 | 只看该作者
使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。
冷月葬花魂 该用户已被删除
10#
发表于 2015-3-2 09:32:09 | 只看该作者
asp.net空间的支持有:ASP.NET1.1/虚拟目录/MicrosoftFrontPage2000扩展/CDONTS,同时他的网站上也提供了Asp.net的使用详解和程序源代码,相信对使用ASP.NET编程的程序员来说会非常有用哦!
爱飞 该用户已被删除
11#
发表于 2015-3-6 15:03:18 | 只看该作者
现在主流的网站开发语言无外乎asp、php、asp.net、jsp等。
若天明 该用户已被删除
12#
发表于 2015-3-20 10:30:44 | 只看该作者
现在的ASP.net分为两个版本:1.1和2.0Asp.net1.1用VS2003(visualstudio2003)编程。Asp.net2.0用VS2005(visualstudio2005)编程。现在一般开发用的是VS2003。
兰色精灵 该用户已被删除
13#
发表于 2015-4-16 13:49:44 | 只看该作者
Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 07:15

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表