我没有接着昨天的函数分析下去,理由是以下两点:
1、RequestStream的作用已经很明确了,可以跳过函数本身的算法,而去研究这例子里的其它内容。RequestStream的作用就
是把从HttpRequestContent里取得的数据分析出来,其中有一部份是文本,另一部份是上传的二进制数据。
当我们实例化一次RequestStream后,它就会把当前请求的数据分析完。确切的说是把已经从用户那读取的数据进行处理。
那么椄下来的任务就是处理后面还没有处理完的数据了。
2、作者的一些算法真的很勉强,太浪费资源了。或许这就是为什么BestCompy的AspNetUpload的效率要高出很多的原因,不用
说,一定是在数据处理的算法上有所突破,而大文件上传的本质是没有变的。。
好了,先把RequestStream类的构造函数放在一边,只用知道它是在帮助我们处理已经上传的数据就行了,为了分析后面的代
码,完成可以不理会已经上传的数据,直接分析后面的代码,,,当然,这样速度一定会比处理数据时快很多。。。
好了,回到HttpMoudle模块里:
在处理完RequestStream后,接下就这样的内容:
if (!workerRequest.IsEntireEntityBodyIsPreloaded())
{
//从请求里读取数据。
while(boundarySize = workerRequest.ReadEntityBody(boudaryBuffer, boudaryBuffer.Length)>0){
//再次处理读取的数据。这里再次读取的数据在数组boudaryBuffer里,这里我省略了它的申明。
//但要还要注意其它的事情,就是用户的链接是否还有效。。。作者在读取数据前判断了一次
//我觉得不用判断,因为读取数据为0的时候就说明请求已经完成了,至于是文件上传完了,还是中断了,可以在后面进
行判断,而不用在处理上传数据的时候来判断用户是否在链接状态。。。好了 ,不管了先。。。
};
}
如果还有数据要读取,也就是说,用户的数据还没有读取完,那么就要接着处理。我做了一个简单的输出测试,得到的结果:
11/3/2005 10:08:01 AM m_application_BeginRequest in the HttpModule.6.859375
11/3/2005 10:08:01 AM Total size:650001432;Current:253952
11/3/2005 10:08:01 AM Total size:650001432;Current:458752
11/3/2005 10:08:01 AM Total size:650001432;Current:663552
11/3/2005 10:08:01 AM Total size:650001432;Current:868352
11/3/2005 10:08:01 AM Total size:650001432;Current:1073152
11/3/2005 10:08:01 AM Total size:650001432;Current:1277952
11/3/2005 10:08:01 AM Total size:650001432;Current:1482752
11/3/2005 10:08:01 AM Total size:650001432;Current:1687552
11/3/2005 10:08:01 AM Total size:650001432;Current:1892352
11/3/2005 10:08:01 AM Total size:650001432;Current:2097152
11/3/2005 10:08:01 AM Total size:650001432;Current:2301952
11/3/2005 10:08:01 AM Total size:650001432;Current:2506752
11/3/2005 10:08:01 AM Total size:650001432;Current:2711552
11/3/2005 10:08:02 AM Total size:650001432;Current:2916352
11/3/2005 10:08:02 AM Total size:650001432;Current:3121152
11/3/2005 10:08:02 AM Total size:650001432;Current:3325952
11/3/2005 10:08:02 AM Total size:650001432;Current:3530752
11/3/2005 10:08:02 AM Total size:650001432;Current:3735552
......
11/3/2005 10:08:45 AM Total size:650001432;Current:341450752
11/3/2005 10:08:45 AM Total size:650001432;Current:341655552
11/3/2005 10:08:46 AM Total size:650001432;Current:341860352
呵呵,可以大概的估算一下,我这里上传的速度大概是7MB/S,当然这是因为我只上传数据而没有做任何数据处理,速度当然
会快一些。。(ASPNetUpload:同样的测试环境4MB/s,Lion的上传组件:2.5MB/s)而源文件编译后的上传组件为2.0MB/s这是
都只是大概的数据,可以说明AspNetUpload确实在算法上有所改进,而Lion的传组件可能改进的不多。
还有,我本来想在多线程里处理上传数据的,但出于以下几个原因,用多线程处理它的可能性不大:
1、ASP.net的运行环境本身就是多线程的。
2、问题的关键不再于服务器上组件的处理能力,与网络带宽很相关,所以就算在服务器上有很高的处理速度,而带宽跟不上
也是白搭。而实现上能达到5MB/s的通信量的带宽并不多。所以先不考虑用多线程来处理上传数据吧。。。
好了,最后的工作已经很明确了,
1、处理上传的文件数据,把它存在在临时文件夹里;
2、错误处理;
在此,对SunriseUpload.0.9.1源代码的分析就先放在这里,后期会对此做些补充。
最后,SunriseUpload.0.9.1源代码的下载地址:
2005.net的引用地址:
http://blog.aspcool.com/rogerwang/archive/2005/10/18/1841.html#3115
下载地址:
http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=fe16801f-2d2c-49fd-be31-d28135365379
最后说一下,getdotnet上有很多开源的内容可下载,有时间可以在上面搜索着试试看。。。。。
文章来源:http://computer.mblogger.cn/wucountry/posts/48537.aspx