Asp.Net 构架(IHttpHandler) - Part.2

Vue中实现word文档渲染、在线编辑、保存 Vue3对word文档进行渲染、编辑、保存。word转成html,html转成word 阅读详情
引言
在 Part.1中,我们了解了Http请求的处理过程以及其它一些运作原理。我们知道Http管道中有两个可用接口,一个是IHttpHandler,一个是IHttpModule,但在Part.1中,我并没有详细讲述如何对它们进行编程,只是轻描淡写地一笔带过。所谓学以致用,前面已经介绍了不少概念和原理。在本文中,我们通过几个范例来了解 IHttpHandler,看看掌握这些原理的实际用途。
IHttpHandler 概述
可能和我一样,很多 Asp.Net开发人员都有过Asp的背景,以至于我们在开发程序的时候,通常都是在“页面级”上思考,也就是说我们现在正在做的这个页面应该有什么样的功能,是进行一个问卷调查还是一个数据库查询等等。而很少在“请求级”思考,考虑有没有办法来通过编码的方式来操控一个Http请求。
实际上, Framework提供了一系列的接口和类,允许你对于Http请求进行编程,而实现这一操作的一个主要的接口,就是 IHttpHandler(另一个是IHttpModule)。
应该还记得第一节中我们提到过 ISAPI,它根据文件名后缀把不同的请求转交给不同的处理程序。但是仔细看看就会发现:几乎一大半的文件都交给 aspnet_isapi.dll 去处理了。很明显,aspnet_isapi.dll 不可能对每种文件采用同一种方式处理,那么 aspnet_isapi.dll 是如何更进一步处理不同的文件,交由谁去处理呢?为了搞清楚这个问题,我们需要打开机器上C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/CONFIG/ 目录下的web.config 文件。
NOTE :我查阅了很多资料,都说是在 machine.config 中,但实际上 v2.0.50727 下的machine.config中httpHandlers结点是这样的:<httpHandlers />,并没有给出详细的处理程序,在Web.config中才能看到。而v1.1.4322 下的machine.config中却有。
找到 httpHandlers结点,应该可以看到如下这样的代码(做了省略):
<httpHandlers>
... ...
<add path="*.axd" verb="*" type="System.Web.HttpNotFoundHandler" validate="True" />
<add path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" validate="True" />
   <add path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory" validate="True" />
   <add path="*.asax" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
<add path="*.ascx" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
   <add path="*.config" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
   <add path="*.cs" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
   <add path="*" verb="GET,HEAD,POST" type="System.Web.DefaultHttpHandler" validate="True" />
   ... ...
</httpHandlers>
可以看到,在 <httpHandlers>结点中将不同的文件类型映射给不同的Handler去处理,对于.aspx来说,是由System.Web.UI.PageHandlerFactory来处理。而对于.cs来说,是由System.Web.HttpForbiddenHandler 处理,从ForbiddenHandler名字中出现的Forbidden (翻译过来是“禁止”)可以看出,这个Handler可以避免我们的源码被看到。
NOTE :System.Web.UI.PageHandlerFactory 是一个 IHttpHandlerFactory,而不是一个单一的HttpHandler,IHttpHandlerFactory用来做什么后面会说明。
上面列出的是 .Net Framework在处理Http请求时的所采用的默认Handler。而如果我们要用编程的方式来操控一个Http请求,我们就需要实现IHttpHandler接口,来定制我们自己的需求。
IHttpHandler的定义是这样的:
public interface IHttpHandler{
    void ProcessRequest(HttpContext context);
    bool IsReusable { get; }
}
 
由上面可以看出 IHttpHandler要求实现一个方法和一个属性。其中 ProcessRequest,从名字(处理请求)看就知道这里应该放置我们处理请求的主要代码。
IsReusable属性, MSDN上是这样解释的:获取一个值,该值指示其他请求是否可以使用 IHttpHandler 实例。也就是说后继的Http请求是不是可以继续使用实现了该接口的类的实例,一般来说,我把它设置成true。
那么实现此接口的类形式应该是这样的:
public class CustomHandler : IHttpHandler{
    public void ProcessRequest(HttpContext context) {
         // 处理请求的代码
    }
    public bool IsReusable {
         get { return true; }
    }
}
而为了能使用这个自定义的 HttpHandler,我们需要在应用程序目录下的Web.config中注册它。
 <system.web>
    <httpHandlers>
      <add path="*.jpg" verb="*" type="MyNameSpace.MyClass, MyDllName" />
    </httpHandlers>
 </system.web>
应该发现这与之前在 C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/CONFIG/目录下web.config中看到的几乎完全一样。这里,path指的是请求的文件名称,可以使用通配符扩大范围,也可以明确指定这个handler仅用于处理某个特定的文件(比如说:filename.aspx)的请求。verb指的是请求此文件的方式,可以是post或get,用*代表所有访问方式。type属性由“,”分隔成两部分,第一部分是实现了接口的类名,第二部分是位于Bin目录下的编译过的程序集名称。
NOTE :如果你新建一个项目,并且在项目下创建 HandlerTest.cs,然后让站点引用该项目,那么在生成解决方案的时候会自动将编译好的.dll文件添到Bin目录中。
NOTE :MyDll只写程序集名,不要加后面的 .dll。
使用HttpHandler实现图片防盗链
有了之前这么多的准备知识,实现现在的目标就容易得多了:
NOTE :这个例子,以及下面的一个例子均来自于《 Maximizing ASP.NET Real World, Object-Oriented Development》一书:
Step.1:创建文件 CustomHandler.cs,代码如下:
using System;
using System.Web;
 
namespace CustomHandler{
    public class JpgHandler : IHttpHandler{
         public void ProcessRequest(HttpContext context){
             // 获取文件服务器端物理路径
             string FileName = context.Server.MapPath(context.Request.FilePath);
             // 如果UrlReferrer为空,则显示一张默认的禁止盗链的图片
             if (context.Request.UrlReferrer.Host == null){
                 context.Response.ContentType = "image/JPEG";
                 context.Response.WriteFile("/error.jpg");
             }else{
                 // 如果 UrlReferrer中不包含自己站点主机域名,则显示一张默认的禁止盗链的图片
                 if (context.Request.UrlReferrer.Host.IndexOf("yourdomain.com") > 0){
                     context.Response.ContentType = "image/JPEG";
                     context.Response.WriteFile(FileName);
                 }else{
                     context.Response.ContentType = "image/JPEG";
                     context.Response.WriteFile("/error.jpg");
                 }
             }
         }
 
         public bool IsReusable{
             get{ return true; }
         }
    }
}
Step.2 编译这个文件
csc /t:library /r:System.Web.dll CustomHandler.cs
Step.3 将编译好的 CustomHandler.dll 拷贝到站点的 Bin 目录下。
Step.4 在Web.Config 中注册这个Handler。
 <system.web>
    <httpHandlers>
      <add path="*.jpg" verb="*" type="CustomHandler.JpgHandler, CustomHandler" />
    </httpHandlers>
 </system.web>
 
OK,诸位可以按步骤自行测试一下,这里就不赘述了。
通过IhttpHandler实现图片验证码
也可以在一个 .ashx文件中实现IHttpHandler,而不是采用这种提前编译的方式。
Step.1 打开Vs2005,“添加新项”,“一般处理程序”。新建文件后,VS会自动在文件中添加如下的代码:
<%@ WebHandler Language="C#" Class="Handler" %>
 
using System;
using System.Web;
 
public class Handler : IHttpHandler {
    public void ProcessRequest (HttpContext context) {
        context.Response.ContentType = "text/plain";
        context.Response.Write("Hello World");
    }
 
    public bool IsReusable {
        get {
            return false;
        }
    }
}
Step.2 将代码改写成如下所示:
<%@ WebHandler Language="C#" Class="Handler" %>
 
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Text;
using System.Web;
using System.Web.SessionState;
 
public class Handler : IHttpHandler, IRequiresSessionState {
 
    public void ProcessRequest(HttpContext context) {
         context.Response.ContentType = "image/gif";
         //建立Bitmap对象,绘图
         Bitmap basemap = new Bitmap(200, 60);
         Graphics graph = Graphics.FromImage(basemap);
         graph.FillRectangle(new SolidBrush(Color.White), 0, 0, 200, 60);
         Font font = new Font(FontFamily.GenericSerif, 48, FontStyle.Bold, GraphicsUnit.Pixel);
         Random r = new Random();
         string letters = "ABCDEFGHIJKLMNPQRSTUVWXYZ";
         string letter;
         StringBuilder s = new StringBuilder();
        
         //添加随机的五个字母
         for (int x = 0; x < 5; x++) {
             letter = letters.Substring(r.Next(0, letters.Length - 1), 1);
             s.Append(letter);
             graph.DrawString(letter, font, new SolidBrush(Color.Black), x * 38, r.Next(0, 15));
         }
        
         //混淆背景
         Pen linePen = new Pen(new SolidBrush(Color.Black), 2);
         for (int x = 0; x < 6; x++)
             graph.DrawLine(linePen, new Point(r.Next(0, 199), r.Next(0, 59)), new Point(r.Next(0, 199), r.Next(0, 59)));
                
         //将图片保存到输出流中      
         basemap.Save(context.Response.OutputStream, ImageFormat.Gif);
         context.Session["CheckCode"] = s.ToString();   // 如果没有实现 IRequiresSessionState ,则这里会出错,也无法生成图片
         context.Response.End();      
    }
 
    public bool IsReusable {
         get { return true; }
    }
}
需要特别注意的是, Handler类不仅需要实现 IHttpHandler接口(这个显然),为了在这个Handler类中使用SessionState,还需要实现IRequiresSessionState接口,对于这个接口,MSDN的解释是这样的:Specifies that the target HTTP handler requires read and write access to session-state values. This is a marker interface and has no methods.(翻译过来是:指定当前Http Handler需要对SessionState值的读写访问权。这是一个标记接口,没有任何方法)。
而实际上, IRequiresSessionState的接口定义是这样的:
     public interface IRequiresSessionState
{
}
可见,这个接口没有任何需要实现的方法或属性,大家只要记得: 如果想在HttpHandler中使用SessionState,必须实现这个接口,实际上也就是在类的标头将这个接口加进去。
Step.3 新建一个ImageCode.aspx页面,在HTML代码中写下:
     <img src="Handler.ashx" alt="图片验证码" />
OK,在浏览器中打开 ImageCode.aspx,应该可以看到如下所示:
利用HttpHandler创建自定义后缀Rss源
RSS如今已经可以说是随处可见,而 RSS的实现方式,通常是在一个.aspx的CodeBehind文件中写一个XML文件,然后加载到Response的OutputStream中, Rss源通常是Rss.aspx这种形式的。通过第一章学到的ISAPI的知识,再结合本章学到的关于HttpHandler的知识,很容易想到:我们可以自定一个以 .rss 作为后缀名的文件来实现 Rss 源,比如说Article.rss。现在我们就一步步来实现它:
Step.1 创建范例数据库
Create Table RssSample
(
    SampleId     Int Identity(1,1)       Not Null,
    Title            Varchar(100)         Not Null Constraint uq_Title Unique,
    Author           Varchar(50)               Not Null,
    PubDate          DateTime             Not Null Default GetDate(),
    [Description]    Varchar(500)         Not Null,
    Link         Varchar(150)         Not Null
 
    Constraint pk_RssSample Primary Key(SampleId)
)
-- 插入范例数据
Insert Into RssSample(Title, Author, [Description], Link)
Values('标题1', '作者1', '文章摘要1', 'http://127.0.0.1/#' )
 
-- 省略 ....
Step.2 建立站点,在App_Code目录下建立RssFeedsLib.cs文件。
using System;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Web;
using System.Xml;
using System.Text;
 
namespace RssFeadsLib {
    public class RssGenerator {
         public static string GetRSS() {
             MemoryStream ms = new MemoryStream();
             XmlTextWriter writer = new XmlTextWriter(ms, null);
             SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=Sample;User ID=sa;Password=sa");      //修改这里成你的数据库连接
             SqlCommand cmd = new SqlCommand("select * from RssSample order by pubdate desc", conn);
 
             conn.Open();
             SqlDataReader reader = cmd.ExecuteReader();
             writer.WriteStartElement("rss");
             writer.WriteAttributeString("version", "2.0");
             writer.WriteStartElement("channel");
             // Channel 下的结点静态写入
             writer.WriteElementString("title", "TraceFact.Net 技术文章");
             writer.WriteElementString("link", "http://www.tracefact.net");
             writer.WriteElementString("description", "Dedicated to asp.net...");
             writer.WriteElementString("copyright", "Copyright (C) 2007");
             writer.WriteElementString("generator", "My RSS Generator");
             // Item 结点从数据库读取
             while (reader.Read()) {
                 writer.WriteStartElement("item");
                 writer.WriteElementString("author", reader.GetString(reader.GetOrdinal("Author")));
                 writer.WriteElementString("title",                 reader.GetString(reader.GetOrdinal("title")));
                 writer.WriteElementString("link", reader.GetString(reader.GetOrdinal("Link")));
                 writer.WriteElementString("description", reader.GetString(reader.GetOrdinal("Description")));
                 writer.WriteElementString("pubDate", reader.GetDateTime(reader.GetOrdinal("PubDate")).ToString(@"ddd, dd MMM yyyy 12:00:00 tt "));
                 writer.WriteEndElement();
             }
 
             writer.WriteEndElement();
             writer.WriteEndElement();
             reader.Close();
             conn.Close();
 
             writer.BaseStream.Flush();
             writer.Flush();
             ms.Flush();
 
             // 将流转换成String并返回
             byte[] data = new byte[ms.Length];
             ms.Seek(0, SeekOrigin.Begin);
             ms.Read(data, 0, data.Length);
             ms.Close();
             return UTF8Encoding.UTF8.GetString(data);
         }
    }
}
Step.3 创建可以处理 .rss 后缀名的 RssHandler
我们在这个 RssFeedsLib命名空间下,再添加一个类,这个类用于处理对 .rss 后缀名文件的Http请求。
    public class RSSHandler:IHttpHandler{
         public bool IsReusable
         {
             get {return false;}
         }
 
         public void ProcessRequest(HttpContext context){
             context.Response.ContentType = "text/xml";
             string str = RssGenerator.GetRSS();
             context.Response.Write(str);
         }
    }
Step.4 在Web.config中进行配置
<httpHandlers>
<add path="*.rss" type="RssFeadsLib.RSSHandler" verb="GET" />
</httpHandlers>
 
NOTE :因为这个类和命名空间位于 App_Code中,这里就不需要再手动编译RssFeadsLib.cs然后将编译好的.dll应用程序集放到Bin目录中了。至于为什么可以这样,将会在 《Asp.Net 构架与安全机制 Part.5 – 页面生存周期与编译模型》中解释。
Step.5 在IIS 对ISAPI进行设置。
应该还记得在 Part.1中如何在IIS中设置ISAPI来进行文件与处理程序映射:
1.     打开 IIS,选择本范例所用的站点,右键,选择“属性”。
2.     选择“主目录”选项卡,点击“配置 ...”按钮。
3.     点击“添加”,设置“可执行文件”为“ C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/aspnet_isapi.dll”,设置“扩展名”为“.rss”,点“确定”。
4.     注意,不要勾选“检查文件是否存在”复选框,这样不用创建文件,只要在地址栏输入任意以 .rss后缀结尾的文件名,均会交由上面创建的Handler去处理,而不管这个文件是否存在,也不管请求的是Article.rss还是Sample.rss。
进行了这些设置以后,现在 IIS就知道如何去处理对.rss后缀名文件的请求了。
Step.6 测试范例
这个时候,随便打开一个页面,比如空白的 Default.aspx,然后我们在地址栏将文件改为:Article.rss(改成abc.rss也是一样),敲回车,应该可以看到如下的画面。
IHttpHandlerFactory 概述
现在假设我们有这样的需求,我们不仅想要处理 .rss 后缀名,还想要能够处理 .atom后缀名,假设处理atom的类命名为AtomHandler,那么我们的Web.config该如何设置呢?我想应该是这样的:
<httpHandlers>
<add path="*.rss" type="RssFeadsLib.RSSHandler" verb="GET" />
<add path="*.atom" type="RssFeadsLib.AtomHandler" verb="GET" />
</httpHandlers>
如果我们有很多个 HttpHandler分别映射不同后缀名的请求,这样我们的Web.config会变得很冗长,或者,我们只有在程序运行时才能确切地知道使用哪个Handler,这个时候,可以考虑实现 IHttpHandlerFactory来完成这一过程。
IHttpHandlerFactory的定义是这样的:
public interface IHttpHandlerFactory{
    IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated);
    void ReleaseHandler(IHttpHandler handler);
}
可见,需要实现两个方法,分别是 GetHandler() 和 ReleaseHandler()。
l       GetHandler(),返回实现了 IHttpHandler接口的类的实例。
l       ReleaseHandler(),使得 Factory可以重复使用一个已经存在的Handler实例。
对于上面 .atom 和 .rss 的问题,我们可以这样来实现 IHttpHandlerFactory接口:
class HandlerFactory:IHttpHandlerFactory{
    public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated){
         string path = context.Request.PhysicalPath;
         if (Path.GetExtension(path) == ".rss"){
             return new RSSHandler();
         }
 
         if (Path.GetExtension(path) == ".atom"){
             return new ATOMHandler();
         }
         return null;
    }
 
    public void ReleaseHandler(IHttpHandler handler){
    }
}
这时,在 Web.Config 中<system.web>节点下进行如下设置即可:
<httpHandlers>
<add path="*.rss,*.atom" type=" RssFeadsLib.HandlerFactory" verb="GET" />
</httpHandlers>
但是,这不能简化 IIS中ISAPI的设置,还是需要手动去对.rss和.atom分别设置。
总结
在本文中,我们首先讨论了aspnet_isapi.dll 如何将对不同后缀名文件的请求分发给相应的处理程序,如何查看 Framework默认的处理程序Handler。
然后,我们通过三个实例,图片防盗链、图片验证码、处理自定义后缀名请求,详细讲解了 IHttpHandler的实现方法和使用过程。
最后,我向大家概要地介绍了 IHttpHandlerFactory接口。

数字IC后端实战:Innovus与ICC2中如何巧妙规避Filler1缺失引发的DRC问题? 本文针对数字IC后端设计中工艺厂不提供最小填充单元Filler1的常见挑战,深入剖析了由此引发的DRC问题根源。详细对比了在Cadence Innovus和Synopsys ICC2两大主流PR工具中,如何通过设置单元间距约束来系统性规避物理缝隙,确保电源网络完整性与制造可靠性,为工程师提供了一套稳健的实战解决方案。 阅读详情

相关推荐

基于STM32 HAL库的L298N四驱电机PWM调速与方向控制实战

本文详细介绍了基于STM32 HAL库驱动L298N电机控制板实现四驱小车PWM调速与方向控制的实战方法。涵盖硬件连接、GPIO与定时器配置、PWM生成、方向控制逻辑及电源管理等核心内容,并提供代码优化与常见问题解决方案,帮助开发者快速实现高效稳定的电机控制。

jump7的博客 222

​在 ASP.NET 中,HTTP 处理程序(HttpHandler)是处理 HTTP 请求的核心组件​

HttpHandler 是。

1100

告别交越失真:手把手教你设计高性能互补输出级电路(LTspice实测)

本文深入剖析音频放大器中常见的交越失真问题,并提供基于LTspice仿真的实战解决方案。通过对比二极管偏置、Vbe倍增器和集成运放驱动三种经典方案,手把手指导设计高性能互补输出级电路,涵盖原理分析、仿真验证及实物调试要点,助力消除音频失真,提升音质。

weixin_29190573的博客 552

HttpHandler详解

概述 HttpHandler是一个HTTP请求的真正处理中心,也正是在这个HttpHandler容器中,ASP.NET Framework才真正地对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中。 IHttpHandler是什么 IHttpHandler定义了如果要实现一个HTTP请求的处理所必需实现的一些系统约定。Ht

Keymo_的奋斗史 1万+

基于PLC的图书馆机器人设计与仿真

本文设计了一种基于PLC的图书馆机器人系统,该系统能提升图书馆自动化管理水平,选用西门子S7-1200系列PLC作为核心控制单元,结合电机驱动、传感器采集以及超声波避障等技术,设计出机器人行走、图书识别与分拣的功能模块,系统借助条形码扫描模块获取图书信息,将其分析后与设定的存放位置做对比,精准达成图书的存取和归还。仿真结果显示,机器人执行任务时运动控制响应时间是0.35秒,避障成功率为98.3%,图书识别准确率高达99.4%,在控制系统方面,运用STEP7-MICRO/WIN软件编程,结合WINCC设计组态

weixin_44553616的博客 1924

基于ABCDRez的激光谐振腔设计与热透镜效应仿真实践

本文详细介绍了如何利用ABCDRez代码包进行激光谐振腔设计与热透镜效应仿真。通过ABCD矩阵理论和高斯光束q参数,该工具能有效模拟热透镜动态变化对腔稳定性的影响,指导腔型优化与热补偿设计,是固体激光器预研与调试的高效辅助手段。

weixin_29093017的博客 290

ASP.NET的必须知道的东东(HttpModule,HttpHandler)之二

在以前的ASP时候,当请求一个*.asp页面文件的时候,这个HTTP请求首先会被一个名为inetinfo.exe进程所截获,这个进程实际上就是www服务。截获之后它会将这个请求转交给asp.dll进程,这个进程就会解释这个asp页面,然后将解释后的数据流返回给客户端浏览器。其实ASP.DLL是一个依附在IIS的ISAPI文件,它负责了对诸如ASP文件,ASA等文件的解释执行,------...

JSGLB61200的博客 543

OpenStack 8 节点生产级高可用(HA)集群实施文档

本文详细介绍了生产级高可用OpenStack集群的架构设计与实施方案。通过采用3节点控制集群(HAProxy+Keepalived)、2节点计算资源池和3节点Ceph分布式存储,实现了控制平面、计算资源和存储系统三个层面的高可用。方案重点阐述了VIP漂移、MariaDB Galera集群、RabbitMQ镜像队列等关键组件的配置方法,并提供了完整的部署流程和故障验证方案。该架构确保任意单节点故障不会影响平台整体可用性,满足生产环境对稳定性、扩展性和可维护性的要求,为构建无单点故障的OpenStack生产环境

彭大帅的博客 781

HttpHandler与HttpModule的理解与应用

神秘的HttpHandler与HttpModule        大学时候我是从拖控件开始学习asp.net的,对.net的很多类库对象都不是很了解。所以看到大家写一些个性的asp.net名词,就感觉asp.net总有一层神秘的面纱笼罩着,让我琢磨不透,相信园子里面也有很多和我经历差不多的.net攻城师。在以前看HttpHandler与HttpModule都是神秘莫测的。哈哈,今天我为大家展示下...

weixin_33770878的博客 242

MIKE21桥墩模拟实战:抠网格与构筑物法对比与选型指南

本文详细对比了MIKE21软件中抠网格法与构筑物法在桥墩模拟中的应用,包括操作步骤、适用场景及优缺点分析。通过实际案例数据展示两种方法的精度与效率差异,并提供选型决策树和常见问题解决方案,帮助工程师根据项目需求选择最优模拟方法。

weixin_42656416的博客 322

NVIDIA GR00T SONIC - 人形机器人强化学习全身控制入门教程(一)

SONIC 是一个类人行为基础模型,它为机器人提供了一套从大规模人类动作数据中学习而来的核心运动技能。与为每个动作单独构建控制器不同,SONIC 将动作追踪作为可扩展的训练任务,因此单一套统一策略即可产生自然的全身运动,并支持多种多样的行为。         🎯 主要特点: 🚶 自然的全身运动(行走、爬行、动态动作) 🎮 支持实时 VR 遥操作 🤖 高级规划与交互的基础 📦 即用型 C++ 推理栈

2506_90492529的博客 840

nginx http handler 过程

一直容易忘记的httphandle处理过程 ngx_http_handler 起步 void ngx_http_core_run_phases(ngx_http_request_t *r) //循环处理函数 { ngx_int_t rc; ngx_http_phase_handler_t *ph; ngx_http_core_main...

linux_vae的专栏 345

11、频率响应与伯德图详解

本文详细介绍了电子电路分析中的频率响应与伯德图,涵盖分贝的定义与计算、带宽与3dB点、放大器反馈机制、倍频程与十倍频程概念,并系统讲解了基于实数和复数零极点的伯德图构建方法。通过具体示例分析了传递函数的渐近近似、幅度与相位响应,并结合MATLAB工具展示了伯德图的绘制过程。文章旨在帮助读者深入理解电路在不同频率下的行为特性,为电路设计与优化提供理论支持。

white的博客 172

Asp.Net 构架(Http Handler 介绍) - Part.2

Asp.Net 构架(Http Handler 介绍) - Part.2 引言 在 Part.1 Http请求处理流程 一文中,我们了解了Http请求的处理过程以及其它一些运作原理。我们知道Http管道中有两个可用接口,一个是IHttpHandler,一个是IHttpModule,但在Part.1中,我并没有详细讲述如何对它们进行编程,只是轻描淡写地一笔带过。所谓学以致用,前面已经...

weixin_30760895的博客 154

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

深入理解 ASP.NET 动态控件 (Part 2 - 编译过程)

前言 要深入理解ASP.NET动态控件,首先就要深入理解整个ASP.NET对页面的处理过程,由你书写好一个ASPX文件(可能还有一个code-behind文件)到你在浏览器中看到的HTML页面,这中间到底发生了什么事。这其中的第一步就是解释ASPX文件并进行编译,也就是这篇文章要讨论的内容。 由于ASP.NET编译本身就是一个大话题,所以我决定在本系列文章把这个题目再细分成几篇

374

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ASP.Net请求处理机制初步探索之旅 - Part 2 核心

开篇:上一篇我们了解了一个请求从客户端发出到服务端接收并转到ASP.Net处理入口的过程,这篇我们开始探索ASP.Net的核心处理部分,借助强大的反编译工具,我们会看到几个熟悉又陌生的名词(类):HttpRuntime、HttpWorkerRequest、HttpContext、HttpApplication等。 (1)Part 1:前奏 (2)Part 2:核心 (3)Part 3:管道...

sinolover的专栏 466

ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline - Part II

二、ASP.NET Runtime Pipeline(续ASP.NET Http Runtime Pipeline - Part I) 现在我们真正进入ASP.NET管辖的范畴,下图基本上囊括整个处理过程涉及的对象,接下来我们一起来讨论这一系列的对象如何相互协作去处理Http Request,并最终生成我们所需的Http Response。 HttpContext 上面我们...

156
上一篇: Asp.Net 构架(Http请求处理流程) - Part.1 (来自张子阳的博客)
下一篇: AJAX+ASP.NET+XML异步交互实例-----写数据到XML文件
squallffx
博客等级 码龄22年 9粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值