ASP.NET MVC学前篇之请求流程

请求流程描述

对于请求的流程,文章的重点是讲HttpApplication和HttpModule之间的关系,以及一个简单的示例实现。(HttpModule又是MVC框架的入口点)

图1

在请求到达Web服务器过后进入ASP.NET的时候是通过ASP.NET来构造出一个HttpWorkerRequest对象,HttpWorkerRequest是抽象类类型,表示着一些请求处理的信息,然后由ASP.NET中的HttpRuntime类型来调用静态函数ProcessRequest(),参数类型为HttpWorkerRequest,因为HttpWorkerRequest是抽象的,在使用的时候应该是系统内部会有个实现类。 在ProcessRequest()方法的内部产生HttpApplication对象,这之间的过程,已经把HttpWorkerPequest对象处理后转变到HttpRequest对象,HttpRequest对象是公开的可代码访问的(图中没有表示出来)。 这个时候还没有执行HttpHandler程序,而是先执行HttpModule中的内容,它们订阅了HttpApplication中的事件用于在请求的各种状态之间做一下自定义的修改(这些在下面的示例中会说到。 然后执行HttpHandler,在处理程序执行完毕后,不是到HttpResponse,而是又到了HttpModule中执行请求完成后的一些自定义操作,这是在HttpApplication中约定好的,在这些都完成的情况下才会做Response操作。

我们将在下面的示例中模拟的演示一下在HttpApplication类型中的事件使用模型。

示例部分

代码1-1

     public delegate void PassNotice(NoticeContext noticeContext);

     public class Order
{
private NoticeContext _noticeContext; public NoticeContext NoticeContext
{
get { return _noticeContext; }
set { _noticeContext = value; }
} private PassNotice _befPassNotice;
public event PassNotice BefPassNotice
{
add
{
_befPassNotice += value;
}
remove
{
_befPassNotice -= value;
}
} private PassNotice _latPassNotice; public event PassNotice LatPassNotice
{
add
{
_latPassNotice += value;
}
remove
{
_latPassNotice -= value;
}
} private void SendGoods()
{
Console.WriteLine("发货…… 请等待接收");
} public void Start()
{
if (_befPassNotice != null)
{
_befPassNotice(NoticeContext);
} if (NoticeContext.IsSend)
{
Console.WriteLine("服务端:客户端已确认可以发货");
SendGoods();
if (_latPassNotice != null)
{
_latPassNotice(NoticeContext);
}
if (NoticeContext.IsAccept)
{
Console.WriteLine("服务端:客户端已收货");
}
}
else
{
Console.WriteLine("服务端:等待客户端确认");
} }
}

Order类代表着订单(这里这个比喻有点不恰当),里面有着两个PassNotice委托类型的事件BefPassNotice、LatPassNotice,分别表示订单发货前的验证和发货后的客户可针对的操作(对应着HttpApplication中的各种事件),再看一下客户类

代码1-2

     public class NoticeContext
{
public bool IsSend { get; set; }
public bool IsAccept { get; set; }
} public class Customer
{
private Order _Order;
public Customer(Order order)
{
_Order = order;
_Order.BefPassNotice += new PassNotice(_Order_BefPassNotice);
_Order.LatPassNotice += new PassNotice(_Order_LatPassNotice);
} void _Order_LatPassNotice(NoticeContext noticeContext)
{
noticeContext.IsAccept = true;
Console.WriteLine("客户端:接收货物");
} void _Order_BefPassNotice(NoticeContext noticeContext)
{ noticeContext.IsSend = true;
Console.WriteLine("客户端:可以发货");
}
}

这里Customer类有着对Order类的引用,并且订阅Order类的事件,从而可以处理到Order类中的NoticeContex类型值(类似于HttpModule)。

调用
代码1-3

             Order order = new Order();
Customer customer = new Customer(order);
order.NoticeContext = new NoticeContext() { IsAccept = false, IsSend = false };
order.Start();

结果如图2所示
图2

示例中还有很多地方没有说明白,只演示了一个大概的模型,还有要说的就是Order类型对应着的处理是单一的(示例中欠妥),就好比HttpApplication只能对应着一个请求一样,当前的上下文信息中也只是存放着当前请求的信息。
在代码1-3中对Customer是直接的调用的,而在ASP.NET中不是这样的。

下一篇将会讲到MVC中的路由部分,对于这个学前篇系列慢慢来完善吧。

作者:金源

出处:http://www.cnblogs.com/jin-yuan/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

ASP.NET MVC学前篇之请求流程的更多相关文章

  1. ASP.NET MVC学前篇之扩展方法、链式编程

    ASP.NET MVC学前篇之扩展方法.链式编程 前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的 ...

  2. ASP.NET MVC学前篇之Lambda表达式、依赖倒置

    ASP.NET MVC学前篇之Lambda表达式.依赖倒置 前言 随着上篇文章的阅读,可能有的朋友会有疑问,比如(A.Method(xxx=>xx>yy);)类似于这样的函数调用语句,里面 ...

  3. ASP.NET MVC学前篇之Ninject的初步了解

    ASP.NET MVC学前篇之Ninject的初步了解 1.介绍 废话几句,Ninject是一种轻量级的.基础.NET的一个开源IoC框架,在对于MVC框架的学习中会用到IoC框架的,因为这种IoC开 ...

  4. 简述C#中IO的应用 RabbitMQ安装笔记 一次线上问题引发的对于C#中相等判断的思考 ef和mysql使用(一) ASP.NET/MVC/Core的HTTP请求流程

    简述C#中IO的应用   在.NET Framework 中. System.IO 命名空间主要包含基于文件(和基于内存)的输入输出(I/O)服务的相关基础类库.和其他命名空间一样. System.I ...

  5. ASP.NET/MVC/Core的HTTP请求流程

    ASP.NET HTTP管道(Pipeline)模型 1. 先讲一点,再深刻思考 一般我们都在写业务代码,优化页面,优化逻辑之间内徘徊.也许我们懂得HTTP,HTTPS的GET,POST,但是我们大部 ...

  6. Asp.net MVC的Model Binder工作流程以及扩展方法(2) - Binder Attribute

    上篇文章中分析了Custom Binder的弊端: 由于Custom Binder是和具体的类型相关,比如指定类型A由我们的Custom Binder解析,那么导致系统运行中的所有Action的访问参 ...

  7. Asp.net MVC的Model Binder工作流程以及扩展方法(1)

    Asp.net MVC的Model Binder工作流程以及扩展方法(1)2014-03-19 08:02 by JustRun, 523 阅读, 4 评论, 收藏, 编辑 在Asp.net MVC中 ...

  8. Asp.Net MVC 进阶篇:路由匹配 实现博客路径 和文章路径

    Asp.Net MVC 进阶篇:路由匹配 实现博客路径 和文章路径 我们要实现 通过路由 匹配出 博客地址 和博客文章地址 例如下面的这两个地址 //http://www.cnblogs.com/ma ...

  9. 【nodejs】让nodejs像后端mvc框架(asp.net mvc)一样处理请求--目录(8/8 完结)

    为什么要做这个 在使用nodejs开发过程中,总是发现需要做很多重复性的体力劳动,且因为自身是服务端程序员出身,感觉有一些服务端好的东西其实可以在nodejs上得到应用并能提高一些开发工作效率. 本系 ...

随机推荐

  1. Python-模块

    一.模块(modue)的概念: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样, ...

  2. 关于一个parent(),siblings()的小问题

    今天发现一个小问题,现在也不知道到底是哪个梗在作祟,但是感觉是parent()和siblings()其中的一个. 我是想这样的根据输入的条件删选内容: demo: <!DOCTYPE html& ...

  3. Ubuntu菜鸟入门(六)—— 有道词典安装

    一.在有道辞掉官网上下载安装包: youdao-dict_1.1.0-0-ubuntu_amd64.deb 二.安装 1.打开下载目录,进行安装 sudo dpkg -i youdao-dict_1. ...

  4. vue2.0有哪些变化

    vue2.0之后有哪些变化: 1.每个组件模板template,不再支持片段代码 之前: <template> <h3>vue-router+vue-loader</h3 ...

  5. 【Apache RocketMQ】RocketMQ捐赠给Apache那些鲜为人知的故事-转自阿里中间件

    序言 今年的双十一对阿里巴巴中间件消息团队来说,注定是个不平凡的日子.在这一天,稳定性小组重点攻克的低延迟存储解决方案成功地经受住了大考.整个大促期间,99.996%的延迟落在了10ms以内,极个别由 ...

  6. hellocharts的折线图与柱状图的结合之ComboLineColumnChartView

    哼哼,网上找了半天都不全,所以决定自己写一个完整的可以直接贴代码的 test.xml <?xml version="1.0" encoding="utf-8&quo ...

  7. mac+phpstorm+xampp断点调试

    1.下载xdebug文件 http://xdebug.org/wizard.php 将phpinfo()的源代码复制到文本框中,xdebug会提示如何配置和下载哪个版本的xdebug. 全部下载地址: ...

  8. Git 版本管理的简单理解

    来源:百度知道 现在使用Git版本管理代码的项目非常多.但是Git本身是一条复杂的系统.我从几个简单的点来说明Git的基本功能.希望能帮助初学者快速入门. 工具/原料   Git code dot j ...

  9. MySql数据库:Host 'localhost' is not allowed to connect to this MySQL server

    修改mysql的root密码后,出现Host 'localhost' is not allowed to connect to this MySQL server 错误. 解决办法: C:\Progr ...

  10. python 引用传递与值传递

    https://taizilongxu.gitbooks.io/stackoverflow-about-python/content/16/README.html 1.也就是如果传可变对象,就是引用传 ...