HTTP Pipeline

————————————————————————————————

————————————————————————————————

————————————————————————————————

———————————————————————————————

http://msdn.microsoft.com/en-us/magazine/cc188942.aspx#S1

处理http请求使用管道模型

如下图:

http请求传到一个HttpRuntime类的实例,也就是管道的开始。HttpRuntime对象检测这个请求,然后识别出他该被发送到哪个应用程序(从管道的角度来看,一个虚拟路径就是一个应用程序。)然后他使用HttpApplicationFactory来找到或者创建一个HttpApplication对象,以此处理请求。一个HttpApplication持有一组HTTP module对象,实现了IHttpModule 接口。HttpApplication 使用HTTP handler factory 来找到或者创建一个HTTP handler对象。HTTP handler是HTTP通信的终点,它处理请求消息,产生相应的响应消息。HTTP handlers和handler factories各自实现了IHttpHandler 接口和IHttpHandlerFactory接口。

一个HttpApplication,它的module和handler在一个时间内只能用来处理一个请求。如果多个请求同时到达,并且指向同一个应用程序,那么将会使用多个HttpApplication。为了效率原因,HttpApplicationFactory和HttpHandlerFactory把HttpApplication和HTTP handler各自池化。

管道使用HttpContext对象来代表每对请求/响应,这个对象传递给HttpApplication,HttpApplication在把它传递给HTTP handler。每个Module也可以访问当前的HttpContext。HttpContext 对象暴露的属性代表了HTTP请求和响应消息,它们是HttpRequest 和HttpResponse 类的实例。HttpContext也暴露了表示安全的属性,和每个Call,每个session,每个application状态。下图表示HttpContext 最常用的属性。

Application:Per-application cross-request state

Application Instance:Application object processing request

Cache:Per-application cached state

Handler:Handler object processing request

Items:Per-request state

Request:HTTP request message

Response:HTTP response message

Server:Utility functions

Session:Per-user cross-request state

User:User information

ASP.NET HTTP管道依靠IIS接收处理请求(它也可以被集成到其他web服务器中)。当IIS收到HTTP请求后,它会检查扩展名,如果文件后缀名关联到的是可执行代码,IIS将会调用代码处理请求。映射文件后缀名和可执行代码的规则记录在IIS元数据库中,当ASP.NET安装后,它会将这个映射关系添加到IIS中,包括.aspx,.asmx映射到aspnet_isapi.dll。

当IIS收到一个HTTP请求,它会调用在aspnet_isapi.dll中的代码,Aspnet_isapi.dll使用一个命名管道将请求从IIS服务转发到ASP.NET工作进程的一个实例上,aspnet_wp.exe。在windows .net服务器上,asp.net集成了IIS6.0内核模式HTTP监听,允许请求从操作系统直接传递到工作进程,不需要通过inetinfo.exe。工作进程使用HttpRuntime类的实例来处理请求

HTTP管道总是在工作进程的一个实例中处理请求,默认的,一个时间内只有一个工作进程在处理。如果你的WEB服务器有多个cpu,你可以配置管道使用多进程。管道工作进程通过APPdomain实现隔离。你可以认为一个Appdomain是一个轻量级的进程中的进程。管道发送所有的HTTP请求,指向同一个虚拟路径到单一的AppDomain。换句话说,每个虚拟路径都被看做独立的应用程序。

ASP.NET支持基于一些规则上,循环利用工作进程,包括时间,时间花销,请求服务数,请求队列数,和物理内存消耗。全局的.NET配置文件,machine.config设置这些值的阀值。当一个aspnet_wp.exe穿过这些阀值,aspnet_isapi.dll会启动一个新的工作进程实例,开始发送请求。老的实例在完成处理请求后终结。循环利用工作进程提升了可靠性。

完整的http请求在asp.net framework中的处理流程:
HttpRequest-->inetinfo.exe->ASPNET_ISAPI.DLL-->Http Pipeline-->ASPNET_WP.EXE-->HttpRuntime-->HttpApplication Factory-->HttpApplication-->HttpModule-->HttpHandler Factory-->HttpHandler-->HttpHandler.Proce***equest()
如果想在中途截获一个httpRequest并做些自己的处理,就应该在HttpRuntime运行时内部来做到这一点,确切的说时在HttpModule这个容器中做到这个的。
可以简单的认为如下的流程。

 

 ——————————————————————————————————————————————————————————————————————————————————————————————————————

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scrapy Pipeline是Scrapy框架中的一个组件,它用于在爬虫数据爬取完毕后对数据进行处理,例如数据清洗、去重、存储等操作。Pipeline是Scrapy的一个重要部分,它可以帮助我们对爬虫获取的数据进行预处理,从而提高数据质量和数据处理效率。 下面是Scrapy Pipeline的使用步骤: 1. 创建一个Pipeline类,继承自scrapy的Pipeline类。该类负责对爬虫获取到的数据进行处理。 ```python import scrapy from scrapy.exceptions import DropItem class MyPipeline(object): def process_item(self, item, spider): # 数据处理代码 return item ``` 2. 在settings.py文件中设置Pipeline。可以设置多个Pipeline,它们会按照顺序依次处理数据。在这里,我们只设置一个Pipeline: ```python ITEM_PIPELINES = { 'myproject.pipelines.MyPipeline': 300, } ``` 这里的`300`是Pipeline的优先级,数字越小,优先级越高。 3. 在Pipeline中实现数据处理逻辑。在上面的示例代码中,我们实现了一个简单的数据清洗逻辑。 4. 在Spider中生成Item并交给Pipeline处理。在Spider中,我们可以通过`yield`关键字将获取到的数据生成`Item`对象,并交给Pipeline处理: ```python import scrapy class MySpider(scrapy.Spider): name = 'example.com' allowed_domains = ['example.com'] start_urls = ['http://www.example.com'] def parse(self, response): for sel in response.xpath('//ul/li'): item = MyItem() item['title'] = sel.xpath('a/text()').extract_first() item['link'] = sel.xpath('a/@href').extract_first() item['desc'] = sel.xpath('text()').extract_first() yield item ``` 这里的`MyItem`是我们在Spider中定义的数据结构,它包含了我们需要获取的数据。 5. Pipeline处理完成后的数据存储。在Pipeline中,我们可以将处理完成的数据存储到数据库、文件或者其他存储介质中。下面是一个将数据存储到MongoDB数据库中的示例: ```python import pymongo class MyPipeline(object): def __init__(self, mongo_uri, mongo_db): self.mongo_uri = mongo_uri self.mongo_db = mongo_db @classmethod def from_crawler(cls, crawler): return cls( mongo_uri=crawler.settings.get('MONGO_URI'), mongo_db=crawler.settings.get('MONGO_DATABASE', 'items') ) def open_spider(self, spider): self.client = pymongo.MongoClient(self.mongo_uri) self.db = self.client[self.mongo_db] def close_spider(self, spider): self.client.close() def process_item(self, item, spider): collection = self.db[spider.name] collection.insert_one(dict(item)) return item ``` 在上面的代码中,我们使用了MongoDB来存储处理完成后的数据。需要注意的是,在Pipeline中,我们需要定义`open_spider`和`close_spider`方法,在Spider开始和结束时分别调用它们,从而保证数据处理的完整性。 以上就是Scrapy Pipeline的基本用法,它可以帮助我们对爬虫获取到的数据进行预处理,从而提高数据处理效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值