仓酷云

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

[学习教程] ASP.NET网页设计Community Server专题四:HttpHandler

[复制链接]
爱飞 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:35:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
完全不一样的。.net其实我也说不太清,.net可以把他理解为跟J2EE相对的工具。c++主要做系统相关的开发你要学.net的话就应该学C#。(其实微软在.NET平台上也考虑了给C++留一个地位。serverHttpHandler完成了ISAPIExtention的功效,他处置哀求(Request)的信息和发送呼应(Response)。HttpHandler功效的完成经由过程完成IHttpHandler接口来到达。
看图先:



在ASP.NET管道处置的末了是HTTPHander,实在每一个Asp.net的Page都完成了IHttpHander,在VS.net中的工具观察器中你能够证明这一点



详细的类是如许界说的:publicclassPage:TemplateControl,IhttpHandler。
接口IHttpHandler的界说以下:
interfaceIHttpHandler
{
voidProcessRequest(HttpContextctx);
boolIsReuseable{get;}
}
接口中ProcessRequest是增加本人的代码举行响应处置的中央。IsReuseable属性指明该HttpHandler的完成类是不是必要缓存。
在CS中有良多承继IHttpHandler接口的类,我掏出有代表性而又简单了解的一个做剖析:找到CommunityServerComponents项目Components目次下的Redirect.cs文件,内容以下:
//------------------------------------------------------------------------------
//<copyrightcompany="TelligentSystems">
//Copyright(c)TelligentSystemsCorporation.Allrightsreserved.
//</copyright>
//------------------------------------------------------------------------------
usingSystem;
usingSystem.Web;
namespaceCommunityServer.Components
{
/**////<summary>
///SummarydescriptionforRedirect.
///</summary>
publicclassRedirect:IHttpHandler
{
publicRedirect()
{
//
//TODO:Addconstructorlogichere
//
}
publicvoidProcessRequest(HttpContextcontext)
{
stringurl=context.Request.QueryString["u"];
if(!Globals.IsNullorEmpty(url))
{
context.Response.Redirect(url);

}
else
{
context.Response.Redirect(Globals.GetSiteUrls().Home);
}
context.Response.End();
}
publicboolIsReusable
{
get{returnfalse;}
}
}
}
这里的Redirect功效是在web哀求满意HttpHandler设置文件中预设前提下主动拦阻实行的,在web.config中<httpHandlers>节点下能够看到
<addverb="GET"path="Utility/redirect.aspx"type="CommunityServer.Components.Redirect,CommunityServer.Components"/>
对该类的设置
・verb能够是"GET"或"POST",暗示对GET或POST的哀求举行处置。"*"暗示对一切哀求举行处置,这里是对GET哀求举行处置。
・path指明对响应的文件举行处置,"*.aspx"暗示对发给一切ASPX页面的哀求举行处置,这里独自对redirect.aspx页面举行处置。能够指明路径,如"blogs"。标明只对blogs目次下的redirect.aspx文件哀求举行处置。
・type属性中,逗号前的字符串指明HttpHandler的完成类的类名,前面的字符串指明Dll文件的称号。
实践处置是怎样的呢?实在redirect.aspx页面在CS项目中其实不存在,CS把对redirect.aspx的哀求处置交给了CommunityServer.Components.dll程序会合Redirect类举行处置。处置的历程是实行
publicvoidProcessRequest(HttpContextcontext)
办法(Redirect类下的ProcessRequest办法是对以后哀求的高低文Context中Url是不是包括“u”参数,假如有而且参数值不为null就挪用Response.Redirect办法跳转到“u”参数值所实行的页面,假如没有参数大概参数值为空就跳转到CS的首页)。
别的在CS中对RSS和Trackback的处置都利用了httpHandler的处置体例。
后面提到,一切页面的基类Page都完成了HttpHandler接口,因而每一个asp.net的页面都能够当作是一个HttpHandler处置类,只是设置部分在machine.config中
<httpHandlers>
<addverb="*"path="*.vjsproj"type="System.Web.HttpForbiddenHandler"/><addverb="*"path="*.java"type="System.Web.HttpForbiddenHandler"/><addverb="*"path="*.jsl"type="System.Web.HttpForbiddenHandler"/><addverb="*"path="trace.axd"type="System.Web.Handlers.TraceHandler"/>
<addverb="*"path="*.aspx"type="System.Web.UI.PageHandlerFactory"/>
<addverb="*"path="*.ashx"type="System.Web.UI.SimpleHandlerFactory"/>
<addverb="*"path="*.asmx"type="System.Web.Services.Protocols.WebServiceHandlerFactory,System.Web.Services,Version=1.0.5000.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"validate="false"/>
<addverb="*"path="*.rem"type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory,System.Runtime.Remoting,Version=1.0.5000.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"validate="false"/>
<addverb="*"path="*.soap"type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory,System.Runtime.Remoting,Version=1.0.5000.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"validate="false"/>
<addverb="*"path="*.asax"type="System.Web.HttpForbiddenHandler"/>
<addverb="*"path="*.ascx"type="System.Web.HttpForbiddenHandler"/>
<addverb="GET,HEAD"path="*.dll.config"type="System.Web.StaticFileHandler"/>
<addverb="GET,HEAD"path="*.exe.config"type="System.Web.StaticFileHandler"/>
<addverb="*"path="*.config"type="System.Web.HttpForbiddenHandler"/>
<addverb="*"path="*.cs"type="System.Web.HttpForbiddenHandler"/>
<addverb="*"path="*.csproj"type="System.Web.HttpForbiddenHandler"/>
<addverb="*"path="*.vb"type="System.Web.HttpForbiddenHandler"/>
<addverb="*"path="*.vbproj"type="System.Web.HttpForbiddenHandler"/>
<addverb="*"path="*.webinfo"type="System.Web.HttpForbiddenHandler"/>
<addverb="*"path="*.asp"type="System.Web.HttpForbiddenHandler"/>
<addverb="*"path="*.licx"type="System.Web.HttpForbiddenHandler"/>
<addverb="*"path="*.resx"type="System.Web.HttpForbiddenHandler"/>
<addverb="*"path="*.resources"type="System.Web.HttpForbiddenHandler"/>
<addverb="GET,HEAD"path="*"type="System.Web.StaticFileHandler"/>
<addverb="*"path="*"type="System.Web.HttpMethodNotAllowedHandler"/>
</httpHandlers>
借助一个工具:Reflector,看看Page类下的HttpHandler处置办法ProcessRequest都做了甚么
[EditorBrowsable(EditorBrowsableState.Never)]
publicvoidProcessRequest(HttpContextcontext)
{
this.SetIntrinsics(context);
this.ProcessRequest();
}
privatevoidSetIntrinsics(HttpContextcontext)
{
this._context=context;
this._request=context.Request;
this._response=context.Response;
this._application=context.Application;
this._cache=context.Cache;
if((this._clientTarget!=null)&&(this._clientTarget.Length>0))
{
this._request.ClientTarget=this._clientTarget;
}
base.HookUpAutomaticHandlers();
}
privatevoidProcessRequest()
{
Threadthread1=Thread.CurrentThread;
CultureInfoinfo1=thread1.CurrentCulture;
CultureInfoinfo2=thread1.CurrentUICulture;
this.FrameworkInitialize();
try
{
try
{
if(this.IsTransacted)
{
this.ProcessRequestTransacted();
}
else
{
this.ProcessRequestMain();
}
this.ProcessRequestEndTrace();
}
finally
{
this.ProcessRequestCleanup();
InternalSecurityPermissions.ControlThread.Assert();
thread1.CurrentCulture=info1;
thread1.CurrentUICulture=info2;
}
}
catch
{
throw;
}
}
在Page类的ProcessRequest办法先是把高低文Context内容赋值到以后Page中的一些属性里,然后挪用System.Web.UI.TemplateControl中的HookUpAutomaticHandlers()
internalvoidHookUpAutomaticHandlers()
{
if(this.SupportAutoEvents)
{
SimpleBitVector32vector1=newSimpleBitVector32(this.AutoHandlers);
InternalSecurityPermissions.Reflection.Assert();
if(!vector1[1])
{
vector1[1]=true;
this.GetDelegateInformation("Page_Init",refvector1,2,4);
this.GetDelegateInformation("Page_Load",refvector1,8,0x10);
this.GetDelegateInformation("Page_DataBind",refvector1,0x20,0x40);
this.GetDelegateInformation("Page_PreRender",refvector1,0x80,0x100);
this.GetDelegateInformation("Page_Unload",refvector1,0x200,0x400);
this.GetDelegateInformation("Page_Error",refvector1,0x800,0x1000);
this.GetDelegateInformation("Page_AbortTransaction",refvector1,0x2000,0x4000);
this.GetDelegateInformation("OnTransactionAbort",refvector1,0x8000,0x10000);
this.GetDelegateInformation("Page_CommitTransaction",refvector1,0x20000,0x40000);
this.GetDelegateInformation("OnTransactionCommit",refvector1,0x80000,0x100000);
this.AutoHandlers=vector1.Data;
}
if(vector1[2])
{
base.Init+=this.GetDelegateFromMethodName("Page_Init",vector1[4]);
}
if(vector1[8])
{
base.Load+=this.GetDelegateFromMethodName("Page_Load",vector1[0x10]);
}
if(vector1[0x20])
{
base.DataBinding+=this.GetDelegateFromMethodName("Page_DataBind",vector1[0x40]);
}
if(vector1[0x80])
{
base.PreRender+=this.GetDelegateFromMethodName("Page_PreRender",vector1[0x100]);
}
if(vector1[0x200])
{
base.Unload+=this.GetDelegateFromMethodName("Page_Unload",vector1[0x400]);
}
if(vector1[0x800])
{
this.Error+=this.GetDelegateFromMethodName("Page_Error",vector1[0x1000]);
}
if(vector1[0x2000])
{
this.AbortTransaction+=this.GetDelegateFromMethodName("Page_AbortTransaction",vector1[0x4000]);
}
elseif(vector1[0x8000])
{
this.AbortTransaction+=this.GetDelegateFromMethodName("OnTransactionAbort",vector1[0x10000]);
}
if(vector1[0x20000])
{
this.CommitTransaction+=this.GetDelegateFromMethodName("Page_CommitTransaction",vector1[0x40000]);
}
elseif(vector1[0x80000])
{
this.CommitTransaction+=this.GetDelegateFromMethodName("OnTransactionCommit",vector1[0x100000]);
}
}
}
办法毗连一些Handlers,经由过程托付加载相干的事务举行页面的初始化事情。
我不再往下剖析,全部Page页面很复杂,有乐趣的伴侣本人渐渐研讨,说这些只是要分明一点,任何一个Page页面都是HttpHandler,页面处置是从这里入手下手。
在.Text的初期版本中(好久没有看.Text的代码了)安装时要设置IIS



在asp.net管道处置的级别上对一些扩大称号做映照,如*.html(实在.Text是做了*.*到ASP.NET映照,够狠!),该扩大名的文件底本间接由IIS提交给哀求者而不会经由asp.net处置机制处置,因而asp.net管道中的httpHandler是不成能拦阻到的,可是只需做以下操纵



这时候,IIS会把对*.html文件的哀求也交由ASP.NET机制去向理,承继IHttpHandler就能够拦阻它(.Text中实践承继的是IHttpHandlerFactory)。有了这些常识就不难了解为何你在.Text体系下观察blog时哀求的是html文件(实在哀求的html文件基本就不存在),前往的信息确是静态页面的内容,这与年夜型CMS体系分歧,并非为了勤俭体系资本事后天生html。DotText之以是如许做扳连到Permalink和SearchEngineFriendly,有这方面乐趣的伴侣能够在google找到良多相干资本。
固然CS中的blog与.Text有密不成分的干系,可是CS中的blog已没有接纳初期.Text的Url扩大名为.html的会见机制,而是间接接纳.aspx扩大名,大概更多思索的是CS的部署成绩,究竟不是一切的CS利用者城市有能够本人设置IIS扩大名映照的权限,年夜多半假造主机也是不供应如许功效的。
HttpHandler还能够用来处置图片与下载的盗链成绩,先在IIS中增加一些经常使用图片扩大名的映照到IIS顶用Asp.net来处置对它的哀求,如许就能够经由过程承继IHttpHandler的类和得当的设置来处置用户的哀求,大抵说一下历程:
在完成IHttpHandler接口的类中,ProcessRequest办法先用

判别前次哀求的URL(为何是判别前次哀求的URL,请看我上一篇专题中对IIS运转历程的解说),假如这个URL是在你限制内那末就挪用Response.WriteFile办法输入文件,假如不是,你能够本人接纳一些措施,好比输入一个带有告诫字样的图片等等。固然,利用HttpHandler处置图片与下载盗链成绩是必要IIS把持权限的,并且必要华侈一些体系资本。
感觉很多控件都必须自己去写代码;用了WebMatrix感觉也不是很好,毕竟没有很强的WYSIWYG效果。现在就不知道如何是好了。
变相怪杰 该用户已被删除
沙发
发表于 2015-1-19 17:59:52 | 只看该作者
但是java靠开源打出的一片天地,特别是在微软的垄断下能打开今天的局面还是有它的生命力的。
简单生活 该用户已被删除
板凳
发表于 2015-1-25 09:45:44 来自手机 | 只看该作者
逐步缩小出错代码段的范围,最终确定错误代码的位置。
不帅 该用户已被删除
地板
发表于 2015-2-8 06:15:26 | 只看该作者
由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。
admin 该用户已被删除
5#
发表于 2015-2-24 12:16:18 | 只看该作者
有一丝可惜的是,这个系列太强了,Java阵营的朋友根本就是哑口无言...争论之火瞬间被浇灭,这不是我想这么早就看到的,但是值了。
再现理想 该用户已被删除
6#
发表于 2015-3-7 12:09:22 | 只看该作者
ASP.net的速度是ASP不能比拟的。ASP.net是编译语言,所以,当第一次加载的时候,它会把所有的程序进行编译(其中包括worker进程,还有对语法进行编译,形成一个程序集),当程序编译后,执行速度几乎为0。
分手快乐 该用户已被删除
7#
发表于 2015-3-15 05:17:07 | 只看该作者
ASP.net的服务器,要求安装一个.net环境,当然我这里指的是windows系统,顺便点一下,.net只能放在windows环境里来运行。Asp.net1.1的就装Framework1.1,Asp.net2.0的就装Framework2.0。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-7 11:12

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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