当前位置: 首页 > news >正文

张家港网站建设模板重庆网站建设qq群

张家港网站建设模板,重庆网站建设qq群,好公司的网站设计,做网站时默认字体是微软雅黑ASP.NET对请求处理的过程#xff1a; 当请求一个*.aspx文件的时候#xff0c;这个请求会被inetinfo.exe进程截获#xff0c;它判断文件的后缀#xff08;aspx#xff09;之后#xff0c;将这个请求转交给 ASPNET_ISAPI.dll#xff0c;ASPNET_ISAPI.dll会通过http管道 当请求一个*.aspx文件的时候这个请求会被inetinfo.exe进程截获它判断文件的后缀aspx之后将这个请求转交给 ASPNET_ISAPI.dllASPNET_ISAPI.dll会通过http管道Http PipeLine将请求发送给w3wp.exe进程在ASPNET_WP.exe进程中通过HttpRuntime来处理这个请求处理完毕将结果返回客户端。     inetinfo.exe进程是www服务的进程IIS服务和ASPNET_ISAPI.DLL都寄存在此进程中。     ASPNET_ISAPI.DLL是处理.aspx文件的win32组件。其实IIS服务器是只能识别.html文件的当IIS服务器发现被请求的文件是.aspx文件时IIS服务器将其交给aspnet_isapi.dll来处理。     w3wp.exe进程ASP.NET框架进程提供.net运行的托管环境.net的CLR(公共语言运行时)就是寄存在此进程中。 ASP.NET Framework处理一个Http Request的流程     HttpRequest--inetinfo.exe--ASPNET_ISAPI.dll--w3wp.exe--HttpRuntime--HttpApplication Factory--HttpApplication--HttpModule--HttpHandler Factory--HttpHandler--HttpHandler.ProcessRequest()ASP.NET 请求处理过程是基于管道模型的这个管道模型是由多个HttpModule和HttpHandler组成ASP.NET 把http请求依次传递给管道中各个HttpModule最终被HttpHandler处理处理完成后再次经过管道中的HTTP模块把结果返回给客户端。我们可以在每个HttpModule中都可以干预请求的处理过程。 注意在http请求的处理过程中只能调用一个HttpHandler但可以调用多个HttpModule。  当请求到达HttpModule的时候系统还没有对这个请求真正处理但是我们可以在这个请求传递到处理中心HttpHandler之前附加一些其它信息或者截获的这个请求并作一些额外的工作也或者终止请求等。在HttpHandler处理完请求之后我们可以再在相应的HttpModule中把请求处理的结果进行再次加工返回客户端。 HttpModule     HTTP模块是实现了System.Web.IhttpModule接口的类。     IHttpModule接口的声明         public interface IHttpModule         {             void Init (HttpApplication context);             void Dispose ();         }         Init 方法系统初始化的时候自动调用这个方法允许HTTP模块向HttpApplication 对象中的事件注册自己的事件处理程序。         Dispose方法 这个方法给予HTTP模块在对象被垃圾收集之前执行清理的机会。此方法一般无需编写代码。          HTTP模块可以向System.Web.HttpApplication对象注册下面一系列事件         AcquireRequestState 当ASP.NET运行时准备好接收当前HTTP请求的对话状态的时候引发这个事件。          AuthenticateRequest 当ASP.NET 运行时准备验证用户身份的时候引发这个事件。          AuthorizeRequest 当ASP.NET运行时准备授权用户访问资源的时候引发这个事件。          BeginRequest 当ASP.NET运行时接收到新的HTTP请求的时候引发这个事件。          Disposed 当ASP.NET完成HTTP请求的处理过程时引发这个事件。          EndRequest 把响应内容发送到客户端之前引发这个事件。          Error 在处理HTTP请求的过程中出现未处理异常的时候引发这个事件。          PostRequestHandlerExecute 在HTTP处理程序结束执行的时候引发这个事件。          PreRequestHandlerExecute 在ASP.NET开始执行HTTP请求的处理程序之前引发这个事件。在这个事件之后ASP.NET 把该请求转发给适当的HTTP处理程序。          PreSendRequestContent 在ASP.NET把响应内容发送到客户端之前引发这个事件。这个事件允许我们在内容到达客户端之前改变响应内容。我们可以使用这个事件给页面输出添加用于所有页面的内容。例如通用菜单、头信息或脚信息。          PreSendRequestHeaders 在ASP.NET把HTTP响应头信息发送给客户端之前引发这个事件。在头信息到达客户端之前这个事件允许我们改变它的内容。我们可以使用这个事件在头信息中添加cookie和自定义数据。          ReleaseRequestState 当ASP.NET结束所搜有的请求处理程序执行的时候引发这个事件。          ResolveRequestCache 我们引发这个事件来决定是否可以使用从输出缓冲返回的内容来结束请求。这依赖于Web应用程序的输出缓冲时怎样设置的。          UpdateRequestCache 当ASP.NET完成了当前的HTTP请求的处理并且输出内容已经准备好添加给输出缓冲的时候引发这个事件。这依赖于Web应用程序的输出缓冲是如何设置的。 上面这么多的事件我们看起来可能会有些眼晕但没关系下面一步一步地看。     HttpModule生命周期示意图 下面是事件的触发顺序 BeginRequest和PreRequestHandlerExecute之间的事件是在服务器执行HttpHandler处理之前触发。     PostRequestHandlerExecute和PreSendRequestContent之间的事件是在服务器执行Handler处理之后触发。          下面我们看一下如何使用HttpModule来实现我们日常的应用         HttpModule通过在某些事件中注册把自己插入ASP.NET请求处理管道。当这些事件发生的时候ASP.NET调用对相应的HTTP模块这样该模块就能处理请求了。        1、向每个页面动态添加一些备注或说明性的文字             有的网站每一个页面都会弹出一个广告或在每个页面都以注释形式!-- --加入网站的版权信息。如果在每个页面教编写这样的JS代码的话对于大一点的网站这种JS代码的编写与维护可是一个很繁琐枯燥的工作。             有了HttpModule我们就可以很简单地解决这个问题了。HttpModule是客户端发出请求到客户端接收到服务器响应之间的一段必经之路。我们完全可以在服务器处理完请求之后并在向客户端发送响应文本之前这段时机把这段注释文字添加到页面文本之后。这样每一个页面请求都会被附加上这段注释文字。             这段代码究竟该在哪个事件里实现呢 PostRequestHandlerExecute和PreSendRequestContent之间的任何一个事件都可以但我比较喜欢在EndRequest事件里编写代码。             第一步创建一个类库ClassLibrary831。             第二步编写一个类实现IHttpModule接口                 class TestModule:IHttpModule                 {                     public void Dispose()                     {                     }                     public void Init(HttpApplication context)                     {                     }                 }              第三步在Init事件中注册EndRequest事件并实现事件处理方法                class TestModule:IHttpModule                 {                     public void Dispose(){}                     public void Init(HttpApplication context)                     {                         context.EndRequest new EventHandler(context_EndRequest);                     }                     void context_EndRequest(object sender, EventArgs e)                     {                         HttpApplication ha (HttpApplication)sender;                         ha.Response.Write(!--这是每个页面都会动态生成的文字。--grayworm--);                     }                 }              第四步在Web.Conofig中注册一下这个HttpModule模块           httpModules            add nameTestModule typeClassLibrary831.TestModule,ClassLibrary831/add           /httpModules            name模块名称一般是类名           type有两部分组成前半部分是命名空间和类名组成的全名后半部分是程序集名称如果类是直接放在App_Code文件夹中那程序名称是App_Code。                 这样在Web站点是添加该类库的引用后运行每个页面会发现其源文件中都会加入“!--这是每个页面都会动态生成的文字。 --grayworm--”这句话。同样的方法你也可以在其中加入JS代码。        2、身份检查             大家在作登录时登录成功后一般要把用户名放在Session中保存在其它每一个页面的Page_Load事件中都检查Session中是否存在用户名如果不存在就说明用户未登录就不让其访问其中的内容。             在比较大的程序中这种做法实在是太笨拙因为你几乎要在每一个页面中都加入检测Session的代码导致难以开发和维护。下面我们看看如何使用HttpModule来减少我们的工作量             由于在这里我们要用到Session中的内容我们只能在AcquireRequestState和PreRequestHandlerExecute事件中编写代码因为在HttpModule中只有这两事件中可以访问Session。这里我们选择PreRequestHandlerExecute事件编写代码。             第一步创建一个类库ClassLibrary831。             第二步编写一个类实现IHttpModule接口                 class TestModule:IHttpModule                 {                     public void Dispose()                     {                     }                     public void Init(HttpApplication context)                     {                     }                 }              第三步在Init事件中注册PreRequestHandlerExecute事件并实现事件处理方法                class AuthenticModule:IHttpModule                 {                     public void Dispose(){}                     public void Init(HttpApplication context)                     {                         context.PreRequestHandlerExecute new EventHandler(context_PreRequestHandlerExecute);                     }                     void context_PreRequestHandlerExecute(object sender, EventArgs e)                     {                         HttpApplication ha (HttpApplication)sender;                         string path ha.Context.Request.Url.ToString();                         int n path.ToLower().IndexOf(Login.aspx);                          if (n -1) //是否是登录页面不是登录页面的话则进入{}                         {                             if (ha.Context.Session[user] null) //是否Session中有用户名若是空的话转向登录页。                             {                                 ha.Context.Response.Redirect(Login.aspx?source path);                             }                         }                     }                 }              第四步在Login.aspx页面的“登录”按钮中加入下面代码                 protected void Button1_Click(object sender, EventArgs e)                 {                     if(true)    //判断用户名密码是否正确                     {                          if (Request.QueryString[source] ! null)                         {                             string s Request.QueryString[source].ToLower().ToString();   //取出从哪个页面转来的                             Session[user] txtUID.Text;                             Response.Redirect(s); //转到用户想去的页面                         }                         else                         {                             Response.Redirect(main.aspx);    //默认转向main.aspx                         }                     }                  }              第五步在Web.Conofig中注册一下这个HttpModule模块           httpModules            add nameTestModule typeClassLibrary831.TestModule,ClassLibrary831/add           /httpModules         3、多模块的操作              如果定义了多个HttpModule在web.config文件中引入自定义HttpModule的顺序就决定了多个自定义HttpModule在处理一个HTTP请求的接管顺序。              HttpHandler     HttpHandler是HTTP请求的处理中心真正地对客户端请求的服务器页面做出编译和执行并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中。     HttpHandler与HttpModule不同一旦定义了自己的HttpHandler类那么它对系统的HttpHandler的关系将是“覆盖”关系。     IHttpHandler接口声明     public interface IHttpHandler     {         bool IsReusable { get; }         public void ProcessRequest(HttpContext context); //请求处理函数     }          示例把硬盘上的图片以流的方式写在页面上         class TestHandler : IHttpHandler         {             public void ProcessRequest(HttpContext context)             {                 FileStream fs new FileStream(context.Server.MapPath(worm.jpg), FileMode.Open);                 byte[] b new byte[fs.Length];                 fs.Read(b, 0, (int)fs.Length);                 fs.Close();                 context.Response.OutputStream.Write(b, 0, b.Length);             }             public bool IsReusable             {                 get                 {                     return true;                 }             }         }         Web.Config配置文件       httpHandlers        add verb* path* typeClassLibrary831.TestHandler,ClassLibrary831/add       /httpHandlers             Verb属性指定了处理程序支持的HTTP动作。*支持所有的HTTP动作;“GET”支持Get操作;“POST”支持Post操作;“GET, POST”支持两种操作。 Path属性指定了需要调用处理程序的路径和文件名可以包含通配符。“*”、“*.aspx”、“showImage.aspx”、“test1.aspx,test2.aspx”Type属性用名字空间、类名称和程序集名称的组合形式指定处理程序或处理程序工厂的实际类型。ASP.NET运行时首先搜索bin目录中的DLL接着在GAC中搜索。          这样程序运行的效果是该网站的任何一个页面都会显示worm.jpg图片。如何只让一个页面default21.aspx执行HttpHandler 中的ProcessRequest方法呢最简单的办法是在Web.Config文件中把path配置信息设为default21.aspx。         根据这个例子大家可以考虑一下如何编写“验证码”了。 IHttpHandler工厂     IHttpHandlerFactory的作用是对IHttpHandler进行管理。工厂的作用请见http://hi.baidu.com/grayworm/blog/item/4a832160f8c9de46eaf8f8c1.html     IHttpHandlerFactory接口的声明         public interface IHttpHandlerFactory         {             IHttpHandler GetHandler (HttpContext context,string requestType,string url,string pathTranslated);             void ReleaseHandler (IHttpHandler handler);         }        GetHandler返回实现IHttpHandler接口的类的实例ReleaseHandler使工厂可以重用现有的处理程序实例。      示例两个用IHttpHandlerFactory来实现对不同HttpHandler的调用。     有两个HttpHandler将图片显示在页面上的HttpHandler和生成验证码的Handler         //将图片显示在页面上的Handler         class TestHandler : IHttpHandler         {             public void ProcessRequest(HttpContext context)             {                 FileStream fs new FileStream(context.Server.MapPath(worm.jpg), FileMode.Open);                 byte[] b new byte[fs.Length];                 fs.Read(b, 0, (int)fs.Length);                 fs.Close();                 context.Response.OutputStream.Write(b, 0, b.Length);             }             public bool IsReusable             {                 get                 {                     return true;                 }             }         }         //生成验证码的Handler          class CodeHandler:IHttpHandler         {             public bool IsReusable             {                 get                 {                     return true;                 }             }             public void ProcessRequest(HttpContext context)             {                 Image b new Bitmap(50,20);                 Graphics g Graphics.FromImage(b);                 SolidBrush sb new SolidBrush(Color.White);                 Font f new Font(宋体, 12);                 string str ;                 Random r new Random();                 for (int i 0; i 4; i)                 {                     str r.Next(10);                 }                 g.DrawString(str,f,sb,0,0);                 b.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);             }         }           IHttpHandler工厂          class TestHandlerFactory : IHttpHandlerFactory          {             public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)             {                                  string fname url.Substring(url.IndexOf(/) 1);                 while (fname.IndexOf(/) ! -1)                     fname fname.Substring(fname.IndexOf(/) 1);                 string cname fname.Substring(0, fname.IndexOf(.));                 string className ; className ClassLibrary831.CodeHandler;                 object h null;                 try                 {                     //h new TestHandler();                     h Activator.CreateInstance(Type.GetType(className));                 }                 catch (Exception e)                 {                     throw new HttpException(工厂不能为类型 cname 创建实例。, e);                 }                 return (IHttpHandler)h;             }             public void ReleaseHandler(IHttpHandler handler)             {             }          }(车延禄)         配置文件     httpHandlers     add verb* pathdefault21.aspx,default22.aspx typeClassLibrary831.TestHandlerFactory,ClassLibrary831/add    /httpHandlers    这样TestHandlerFactory就会根据请求的不同页面执行不同的HttpHandler处理程序了。 HttpHandler使用会话     如果要在处理程序中使用Session那必须把该HttpHandler实现IRequiresSessionState接口,IRequiresSessionState接口是个空接口它没有抽象方法只是一个标记。下面是一个文件上传的例子 1、先引用System.Web.SessionState这个命名空间 2、如果是要在HttpHandler中读取Session的内容就要在实现IHttpHandler的类中同时实现IReadOnlySessionState这个接口。 3、如果是要在HttpHandler中读写Session的内容就要在实现IHttpHandler的类中同时实现IRequiresSessionState      这样就可以在自定义的HttpHandler 中正常的使用Session了。 /// summary /// 上传文件事件; /// /summary public class Upload : IHttpHandler, IRequiresSessionState {         public Upload()     {     } #region IHttpHandler Members public bool IsReusable     {         get { return true; }     } public void ProcessRequest(HttpContext context)     {         string temp context.Session[temp].ToString(); string EncryptString context.Request.QueryString[User];                  if (temp! context.Request.Files.Count 0 )         {                string uploadPath context.Server.MapPath(context.Request.ApplicationPath /Upload/ temp);    if (Directory.Exists(uploadPath) false)//不存在该目录时自动创建一个目录              {                   Directory.CreateDirectory(uploadPath);              }                         for(int j 0; j context.Request.Files.Count; j)             {                                 HttpPostedFile uploadFile context.Request.Files[j];                                 if (uploadFile.ContentLength 0)                 {                                          uploadFile.SaveAs(Path.Combine(uploadPath, uploadFile.FileName));                         }                             }         }                  //HttpContext.Current.Response.Write( );             } #endregion } 后台代码: public partial class _Default : System.Web.UI.Page  {     protected void Page_Load(object sender, EventArgs e)     {         string jscript function UploadComplete(){ ClientScript.GetPostBackEventReference(LinkButton1, ) };;         Page.ClientScript.RegisterClientScriptBlock(this.GetType(), FileCompleteUpload, jscript, true);         Session[temp] yekin;         FormsIdentity cIdentity User.Identity as FormsIdentity;         string encryptString Session[temp].ToString();         flashUpload.QueryParameters string.Format(User{0}, encryptString);             } protected void LinkButton1_Click(object sender, EventArgs e)     {       Response.Write(scriptalert(恭喜您上传成功!);/script);                    // MyGrid.DataBind();     } } 分类: C#, Net
http://www.zqtcl.cn/news/809298/

相关文章:

  • 网站制作的页面比例企业为什么建立企业网站
  • 网站开发技术的发展专业的seo网站优化公司
  • 十大ppt模板免费下载网站惠州网络营销
  • 网站建设自优化网站首页
  • 网络营销推广方式包括哪几种湘潭网站seo磐石网络
  • 英文WordPress站点切换为中文优化神马网站关键词排名价格
  • 宁波网站建设免费咨询网站建设服务费怎么做会计分录
  • 工作期间员工花钱做的网站wordpress文章内容乱码
  • 艺术设计招聘网站多用户商城网站方案
  • 杭州最大的网站开发有多少专门做兼职的网站
  • 萍乡做网站的公司做偏门网站
  • 成都网站开发价格企业网站管理系统破解版
  • 郑州新闻头条最新消息百度小程序关键词优化
  • 甘肃省通信管理局网站北京软件开发公司排名前十强
  • 用现成的网站模板只套内容就可以有这样的吗忻府网站建设排名
  • 网站设计结果泸州市住房和城乡建设厅官方网站
  • php网站开发入门到精通教程旅游网站项目评估
  • 四川省城乡和住房建设厅网站首页通过邮箱查注册网站
  • 自己的网站怎么编辑如何做响应式的网站
  • 做一个产品网站要多少钱网站宣传与推广的方法
  • 郑州区块链数字钱包网站开发公司局部装修改造找哪家装修公司
  • 网站界面可以做版权吗学生网站建设的总结与评价
  • 用表格做网站10条重大新闻
  • 河南定制网站建设报价盐城网站建设制作工作室
  • 能看各种网站的浏览器wordpress文章名称背景
  • ppt做视频模板下载网站网站建设在哪些方面
  • 能用pinduoduo做网站吗网站建设行业的分析
  • 新乡商城网站建设价格做网站网站会怎么样
  • 给个网站能用的2022作品集模板
  • 做推送好用的网站科技资讯网站有哪些