[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:暂无标签
留言反馈
@ saucer: Yup, I am aware of the subtle difference here, but that's not the cause of the problem, : )
@ 开心: 呵呵,就是因为这个,: )
去年用了下IE7 Beta 2, totally disappointed. 昨天试了正式的版本,印象还不错。
关于.Text中的编辑器不支持IE7的问题,我在去年就发现了,没有来得及更改呢。建议你先使用Windows Live Writer来解决此问题,我们稍候会在后台升级:)
<httpRuntime useFullyQualifiedRedirectUrl="true" maxRequestLength="2048" executionTimeout="3600">
...
</httpRuntime>