随笔 - 47, 评论 - 255, 引用 - 17

导航

工具

关于

我是新人,: )

每月存档

广告



访客

 

[Main Reference: Shawn Cicoria, Http.sys in WinXP SP2: What It Means with Windows Communication Foundation]

微软在Windows 2003 Server里引进了新的HTTP API和kernel mode driver Http.sys,目的是使基于Http服务的程序更有效率。这个改变的直接收益者就是IIS 6.0和ASP.NET。

其实在Windows XP安装SP2后,Http.sys已经出现在系统里了,但事实上,操作系统并没有真的使用这个内核级驱动,而XP上自带的IIS 5.1也没有使用HTTP API。

新的HTTP API里最核心的变化都封装在Http.sys这个kernel mode driver里了。在此之前,基于HTTP协议的程序都是在User mode下运行的,而且必须自己处理诸如软件中断、context switch、线程调度等等问题,并且往往无法自由接触系统资源。过去,HTTP服务器,如IIS, Apache等都是利用Winsock API来创建一个User mode下的network listener。Network listener通常独自(i.e.: per application or per thread basis)占用一个IP端口。通俗点说,就是在同一时间只有一个应用程序可以监听一个端口,这在有些时候是一个不太令人舒服的限制。你可以参看一下这个文件: %windir%\system32\drivers\etc\services,看看哪些程序需要占用哪些端口。

下面两张图展示了新的程序架构:

IIS 5 Process Model

IIS 6 Process Model

在IIS6中,我们可以看到使用了独立工作线程模式,并且直接调用了HTTP API和Http.sys,这使得诸如HTTP handshake和request management等工作可以直接在内核模式下进行处理,这样做效率更高,限制更少。并且,现在用户模式下运行的Application可以把注意力集中处理高层的程序逻辑上,而将底层的诸如请求调度、资源分配、socket管理等工作交给Http.sys来处理。在Windows 2003上,ASP.NET 1.1和2.0都使用了独立工作线程的模式,并且利用了新的HTTP API。在将来的IIS 7里,微软会引进新的Windows Activation Services (WAS)技术。

新的Http.sys带来的好处大致有如下一些:

1. 缓存 - 静态的内容现在被缓存于内核模式下,这使服务响应速度更快

2. 记录 (Log)-IIS的log功能更快且标准化了

3. 带宽控制 - greater scalability control and throttling (man, I hate these buzz words...)

4. 可靠性 - 所有的服务请求会在Http.sys里暂存入队列,而不是由服务程序本身来处理,这样,即使服务程序重启,尚未被处理的请求也不会丢失了

5. IP端口重用 - 现在,只要是通过Http.sys管理的端口(基本包括了那些著名的端口,比如80),都可以同时允许多个程序同时监听了,当然,在编程的时候,还有些命名规则需要注意,请查阅相关资料。

要利用新的HTTP API必须使用Windows 2003平台。在.NET 1.1中,你必须自己写wrapper class利用PInvoke来调用native的HTTP API (doc: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/http/http/http_api_start_page.asp)。在2.0中,.NET加入了新的HttpListener类,从而使调用HTTP API变得很简单。

而当在更新的Windows Communication Foundation (aka, Indigo)里,这一切就更简化了,WCF不但直接使用了HttpListener,而且提供了对很多典型的网络通讯模式的支持,比如Duplex Message Exchange Pattern等。并且,如果想让多个程序监听一个共同的端口,你现在需要做的只是在WCF里注册一下不同服务的URI就行了(notice, there are more details you need to know here to actually get it to work)。

 

Duplex over Http Message Exchange

更多关于如何编程的信息请Google (oops, Live search) 文中的各个关键字,本文只是做一个初步的介绍。

More reading: IIS 6 performance: http://www.microsoft.com/technet/prodtechnol/windowsserver2003/technologies/webapp/iis/iis6perf.mspx

=========================================================================================

关于IIS 6和Http.sys,我前两天的时候碰到一个奇怪的情况。我利用HttpModule写了一个Http服务,但我的测试程序发出一个url超长的请求时 ( > 260 chars),IIS立刻返回400 bad request。

我查阅了很多资料,发现Http.sys有对Url Segment length有限制(max: 260 chars),通过修改注册表,我们可以改变这个limit: http://support.microsoft.com/kb/820129

但更奇怪的问题是,我该了UrlSegmentMaxLength键值后,IIS仍然返回400 bad request。又经过多方询问,有人竟告诉我这个不是IIS的问题(确实不是IIS的问题,因为我查到有其他例子在修改UrlSegmentMaxLength后顺利运行的),而是CLR/ASP.NET对max path length有限制。

我真是吓到了。CLR? Max path length = 260??!! Are we back to the dark ages?? I simply cannot believe it....

如果有哪位知道确实的情况,请不吝赐教。

P.S.: IE 7 does not cooperate with the online editing control of .TEXT.  I have to reformat the whole article in IE 6.  Probably have to use Windows Live Writer for a while now until we upgrade the system.

相关文章

打印 | 张贴于 2006-10-19 18:34:00 | Tag:暂无标签

留言反馈

#re: Http.sys 编辑
研究中
2006-10-26 17:12:00 | [匿名用户:戴尔网站]
#re: Http.sys 编辑
@ 疾风:多些你的信息。跟据msdn的说明来看:maxRequestLength - Indicates the maximum file upload size supported by ASP.NET. This limit can be used to prevent denial of service attacks caused by users posting large files to the server. The size specified is in kilobytes. The default is 4096 KB (4 MB). 似乎不是我所需要的,: ) 我也试了一下,确实不是。But thanks a lot anyway, : )

@ saucer: Yup, I am aware of the subtle difference here, but that's not the cause of the problem, : )

@ 开心: 呵呵,就是因为这个,: )
去年用了下IE7 Beta 2, totally disappointed. 昨天试了正式的版本,印象还不错。
2006-10-20 02:04:00 | [匿名用户:demonfox]
#re: Http.sys 编辑
怪不得看到你这几天在内部的ASP.NET Discussion里面这么活跃呢,原来在研究这个东东。

关于.Text中的编辑器不支持IE7的问题,我在去年就发现了,没有来得及更改呢。建议你先使用Windows Live Writer来解决此问题,我们稍候会在后台升级:)
2006-10-19 22:09:00 | [匿名用户:开心就好]
#re: Http.sys 编辑
我听说在web.config文件作如下的修改就可以了(我没试过,demonfox兄不妨试试)

<httpRuntime useFullyQualifiedRedirectUrl="true" maxRequestLength="2048" executionTimeout="3600">
...
</httpRuntime>
2006-10-19 20:50:00 | [匿名用户:疾风]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode MVC Blogger System