公司之前有这样一个业务需求:

  一名同事做出文件a0和b0,然后将a0加密为a1、b0加密为b1;再将文件a0、a1、b0和b1上传至服务器M;同时要将服务器N上的数据表添加一条记录,该记录的ID就是前面四个文件的文件名(扩展名各不相同)。另外说一句,公司网站也在服务器N上,一会儿会用到这点。

公司原来的实现模式是这样的:

  程序员小x用VB写了一个软件,能将文本文件生成文件a0,并将文件a0加密为a1,还生成一个access数据库文件,通过软件界面收集到的信息,生成一条记录为稍后向服务器N添加记录提供字段值;

  程序员小y用C++的MFC写了一个软件,能将做好的b0文件加密为b1(加密过程调用公司同事小z的一个dll库),再根据access数据库文件的信息将a0、a1、b0、b1上传至服务器M,最后将服务器N上的数据表添加记录。

  公司现在想要用B/S模式实现文件上传的功能,而且目前程序员小x和小y都已经离职,只剩C++程序员小z。我是C#程序员,不太会C++和VB,对现有的状况和公司的要求仔细考虑了一下,做出如下方案:

  因为程序员小x的VB软件涉及到a0文件的生成和加密,以及该记录各字段信息的收集功能,公司里也没有VB程序员,改动程序比较困难,重新用C++或C#写一个软件工作量又大(老板要求尽快完成,且不要弄得太复杂、太麻烦),所以小x的VB软件不动;再看程序员小y的MFC程序软件,它实现了b0文件的加密(调用小z的库),实现4个文件的上传和向服务器N中的数据库写记录(根据access文件)的功能,所以小y的软件不要了;

  而让小z做一个简单的MFC程序软件,实现如下几点功能:1、让用户选择一个access文件(用户用小x软件生成的access文件),程序读取数据表信息;2、根据数据表中各记录的ID值把指定文件夹中b0文件加密成为b1文件;3、将数据表及表中各记录ID值对应的a0、a1、b0、b1文件添加到一个压缩包文件。最后让用户访问我写好的一个页面,有一个上传flash插件和一个保存按钮,具体功能实现如下。

  上传flash插件选择压缩包文件,上传flash插件指向后台ashx文件,将这个压缩包文件保存至服务器N站点(公司网站)下的一个文件夹中;这个上传文件的功能做了前后台的验证,前台用js做文件类型、长度等信息验证,而后台也对HttpPostFiles对象里的相关属性验证;服务器保存完毕后,用户在页面点击保存按钮,按钮的点击事件执行如下操作:1、进行操作合法性验证;2、解压缩文件包;3、找到access数据库文件,并读取其中数据信息;4、循环遍历每一行,执行FTP上传至服务器M,每上传成功一条记录对应的所有文件,便将这条记录添加到服务器N中的数据库中。
  操作合法性验证:当前登录用户是否为预期的用户,指定的压缩包文件是否存在。

  解压缩文件包:用了一个解压缩库,将压缩包内的文件解压缩到指定的文件夹中。

  读取access数据库文件:若不存在则返回,否则将数据表中数据记录读取到DataSet中。

  循环遍历数据表,并执行FTP上传:循环DataTable,每次获取DataRow后,将记录ID对应的4个文件上传至服务器M上,确保所有文件都上传成功后,向数据库(公司网站服务器就是服务器N)写入记录,在上传之前判断该记录ID是否已经存在在服务器数据库中,若存在则跳过,FTP上传也用了一个库。额外做了一个数据表,记录上传状态,同时在FTP上传功能代码段中加入了写日志文件功能,以便确定上传失败的原因。

  最后对实现这个功能过程中遇到的一些问题及解决思路:
  一、用小文件测试上传时,上传功能正常,可是换了真正的大文件时,上传功能出错。
    一开始没意识到是asp.net配置的问题,因为是上传flash插件无法将请求提交到ashx文件,而且用VS调试运行也不行,用IIS运行则报500或404错误。还以为是项目或flash插件出了问题,可是调试都不进断点,所以找不到原因,后来突然换回之前的小文件,功能正常。于是乎知道了答案:asp.net有个默认的请求长度限制,这个要在web.config中进行设置。<httpRuntime maxRequestLength="820000" executionTimeout="14400"/>maxRequestLength属性就是,其默认值为4096(4MB),注意除非做上传功能,否则这个值不要设置过大,因为这个值的意义在于防止拒绝服务攻击;还有executionTimeout属性,这个意思是在被 ASP.NET 自动关闭前,允许执行请求的最大秒数,默认值为110秒(.NET1.0和.NET1.1默认值为90秒);还有一个是Session超时<sessionState timeout="240"/>默认值为20分钟。
  二、上传一条记录(也就是4个文件)时没有问题,可上传10条记录时过一段时间就无响应了,经过多次观察发现这个时间是20分钟左右(根据日志文件最后一次写入时间判断)。
    一开始以为是网络连接断了,可是也应该在我的日志文件中抛出异常,可是没有。经常是某文件开始上传,之后就没下文了,就不再写日志文件了。经过多次试验,觉得可以认为是程序运行中断,但是是什么原因呢?后来知道IIS中有一项设置,IIS-网站站点所用的应用程序池-右键高级设置-闲置超时属性,系统默认值为20分钟,这下可以确定了,就是20分钟没人请求网站,IIS认为闲置超时,所以将进程停止,导致程序运行中断。因为本地测试是在我电脑上的IIS,所以只有我一个人访问,而我主要测试上传,所以上传后就一直在等待,也没有访问其他页面。而真正的网站可能会被很多人访问,所以这个情况不大容易出现。
  三、上传文件后,进行保存操作,服务器端需要进行读数据库、解压文件、FTP上传、写数据库,10个文件时大约用1分钟,因此我想将这些耗时操作放到异步线程中执行,如何实现?
    一开始以为开个新线程就能实现,多线程就代表异步执行吗?百度也没有查到new Thread(某个方法),然后.Start(),是不是异步执行,网上只说Invoke是同步执行,而BeginInvoke是异步执行。后来终于查到用委托的BeginInvoke就是异步执行,同时博问中有个回答者给出了委托的BeginInvoke是否新开线程的测试代码,经过测试委托的方法是在新线程中执行的,这样就坚定了我的信心。而我也没有自己写委托,网上介绍.NET3.5新增了系统委托Action和Func(可能还有其他),刚好我的站点用.NET4.0,所以就用它,同时还用到匿名委托,这样参数和返回值都不需要有,于是果断用Action(不带任何泛型,带一个泛型则说明有一个参数,最多可能有16个,而Func至少有一个泛型,最后一个泛型为返回值,必须有返回值,其余泛型为参数,可以没有参数,最多可能有16个),并在Action对象.BeginInvoke()方法后响应输出给客户端提示信息,而异步线程在服务器端自行运行。

  四、测试本地项目打开页面时,javascript控制台显示一直有脚本在不断执行请求。(2014-3-11补充)

    一开始以为复制粘贴已有代码时,把不相关的JS脚本代码一并贴过来了,检查并没有发现这样的脚本。这是怎么回事呢?难道电脑中病毒了,系统或浏览器被劫持,被恶意注入JS自动执行脚本了吗?换了几个浏览器都有同样的现象发生,用本机架设的IIS服务器访问IP地址页面和用VS访问localhost页面,仍然有这个现象发生。回头再找开发者工具中的HTML功能,发现里面确实生成了一段我没写过的JS脚本代码,将其动态删除后,不断执行请求的JS脚本停止运行了。而且发送请求的地址是以localhost地址发送的,并且端口号也跟VS调试页面所用端口不一样。后来在开发者工具的网络界面中发现这个请求中含有一个关键词“Browser Link”,于是乎用这个关键词百度了一下,居然有结果,而且就是我要寻找的原因。原因是VS2013(我之前一直使用VS2010,最近在升级使用VS2013版本的)为调试Web项目新增一个功能,多浏览器动态实时刷新功能(我个人理解的意思,如果大家想详细了解,请百度之),这个是默认启用的,也可以关闭这个功能,有了这个功能,在VS调试页面时可以同时开多个浏览器调试同一个页面,而且修改这个页面上前端代码(也可能包含服务器端代码,没具体使用这个功能)的同时,浏览器实时显示新修改好的效果。

  代码就不贴了,自己做个总结,以后遇到类似问题可供参考。

ASP.NET服务器端执行耗时操作的工作记录的更多相关文章

  1. Winform 界面执行耗时操作--UI卡顿假死问题

    UI卡顿假死问题 误区1:使用不同的线程操作UI控件和耗时操作(即,跨线程操作UI控件CheckForIllegalCrossThreadCalls = false;), 注意:此处只是为了记录... ...

  2. RxJava2-后台执行耗时操作,实时通知 UI 更新(一)

    一.前言 接触RxJava2已经很久了,也看了网上的很多文章,发现基本都是在对RxJava的基本思想介绍之后,再去对各个操作符进行分析,但是看了之后感觉过了不久就忘了. 偶然的机会看到了开源项目 Rx ...

  3. Parallel 类并行任务(仅仅当执行耗时操作时,才有必要使用)

    using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...

  4. C# WinForm 异步执行耗时操作并将过程显示在界面中

    private void button3_Click(object sender, EventArgs e)        {            RunAsync(() =>         ...

  5. JavaScript操作XML工作记录

    JavaScript操作XML (一) JavaScript操作XML是通过XML DOM来完成的.那么什么是XML DOM呢?XML DOM 是: 用于 XML 的标准对象模型 用于 XML 的标准 ...

  6. winform 开发中 把耗时操作 封装起来 异步执行(.net 4.0)

    .先定义一个 BackgroundTask.cs 代码如下: public class BackgroundTask { private static WaitDialogForm LoadingDl ...

  7. AsyncTask 进行耗时操作和UI 更新

    相信各位对 AsyncTask 不会陌生,虽然它有如下弊端: 1. 如果在activiy内部new 一个AsyncTask, 横竖屏切换生成一个新的activity,等结果返回时,处理不好容易出现NP ...

  8. AsyncTask 处理耗时操作&&显示进度条

    在Android中实现异步任务机制有两种,Handler和AsyncTask.优缺点自己百度,推荐使用AsyncTask. private ProgressDialog dialog; //新建一个对 ...

  9. 主线程不能执行耗时的操作,子线程不能更新Ui

    在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 在看方法之前看一下Android中消息机制: 引用 Message:消息 ...

随机推荐

  1. javascript中this的学习总结

    在开发中,this多使用在function函数中,也正是由于调用function的对象的不同,才导致了this的指向不同.需要明白(1).function也是对象:(2).function执行时是在某 ...

  2. C++标准转换运算符reinterpret_cast

    C++标准转换运算符reinterpret_cast reinterpret_cast <new_type> (expression) reinterpret_cast运算符是用来处理无关 ...

  3. iptables一些经常忘掉易混淆的参数

    -A:新增加一条规则,该规则在原规则的最后面 -p:规定应用于哪种数据包,例如:tcp,udp等 -d:(destination),表示目标IP或网络 -s:(source),表示源IP或网络 -j: ...

  4. mysql 用户方面的操作

    1.只新建用户的操作 mysql -u root -p密码mysql> insert into mysql.user(Host,User,Password) values(‘localhost’ ...

  5. ExtJS学习之路第一步:对比jQuery,认识ExtJS

    最近纷杂的事情比较多了,奔波ing!所以,Node.js 和Canvas动画系列都停止了,等稳定了再重拾书本继续学习!因为某种原因最近在看ExtJS,分享下学习的心得,希望对同道中人有所帮助. 第一用 ...

  6. glutBitmapCharacter及glBitmap在ATI显卡下无法正常显示的原因初探

    最近家里台式机的老显卡烧了,所以更换了ATI的HD6450显卡,却发现glutBitmapCharacter及glBitmap都无法正常显示字符,nviDIA和intel的显卡则一切正常. 发邮件咨询 ...

  7. LR监控Windows资源

    1.监控准备: 监控方: 1)安装tcp/ip协议下的netbios 2)用administrator登录 被监控方: 1)被监控的Windows开启两个服务: Remote ProcedureCal ...

  8. HttpWatch详解

    一 概述: HttpWatch强大的网页数据分析工具.集成在Internet Explorer工具栏.包括网页摘要.Cookies管理.缓存管理.消息头发送/接受.字符查询.POST 数据和目录管理功 ...

  9. unity3d的四元数 Quaternion

    原地址:http://www.cnblogs.com/88999660/archive/2013/04/02/2995074.html 今天准备学习和研究下unity3d的四元数 Quaternion ...

  10. Ubuntu上安装gtk2.0不能安装的问题,“下列的软件包有不能满足的依赖关系”

    zez@localhoss:~$ sudo apt-get install libgtk2.0-dev正在读取软件包列表... 完成正在分析软件包的依赖关系树       正在读取状态信息... 完成 ...