长时间运行的http进程 - 如何放入单独的进程?

时间:2010-07-21 06:10:20

标签: asp.net wcf service

我知道所有地方都有类似的问题,但我找不到与我所追求的有直接关系的问题。

我有一个用户上传数据文件的网站,然后该文件被转换并导入到SQL中。该文件的大小可能高达50mb,有时这个过程可能需要30分钟甚至更长时间。

我意识到我需要将实际工作转移到另一个进程,并在网页上轮询该进程。我想知道最好的方法是什么?作为一名网络开发人员,我发现所有这些新的Windows服务有点令人困惑,我只是想在某个地方开始。

所以:

  • 我可以/我应该使用Windows服务吗?如果是这样,怎么样?
  • 我应该使用WCF吗?如果这在IIS下运行,我是否会遇到aspnet_wp.exe回收问题并使我的进程超时?

澄清

数据被导入到sql中,没有文件分发。

如果出现故障,绝对必须向用户报告。从异步任务开始的那一刻起,网页将轮询每个,比如5秒,以获得导入的“状态”。一旦完成,另一个响应将告诉页面停止轮询状态更新。

查询最终决定

好吧,我想,似乎Windows服务是最好的主意。至于如何让它工作,似乎'把文件放在那里等待服务拿起'想法是普遍接受的方式,有没有办法我可以启动服务运行的进程,没有它必须经常检查数据库表/文件夹?正如我之前所说,我对Windows服务没有任何经验 - 我想知道我是否在服务中放置了一个公共方法,我能以某种方式调用它吗?

2 个答案:

答案 0 :(得分:3)

嗯......

var thread = new Thread(() => {
    // your action
});
thread.Start();

但你会遇到问题:

  • 如果导入到sql失败怎么办?应该对客户有任何回应
  • 如果失败,您如何在以后的请求中确保该文件
  • 如果应用程序关闭怎么办...这个新创建和启动的线程将被杀死
  • ...

将所有内容存储在sql(特别是文件......)中并不总是一个好主意。如果你想让文件可供多个服务器使用,为什么不通过ftp分发它们??

我相信你的整个概念有点混乱(假设这样),如果你详细说明并向我们提供有关你的意图的更多信息,它可能会有所帮助!

修改

  

我能做/我应该这样做吗?   有Windows服务?如果是这样,怎么样?

你可以:)我建议你创建一个简单的控制台程序,并用srvanysc转换它。你可以粗略地了解如何here(注意:在=之后插入空白......这是一个愚蠢的陷阱)

术语should是相对的,因为您没有回答最重要的问题

  

如果记录持久存储到数据库,告诉消费者文件test.img应该保留,但是您的服务没有捕获它或者还没有转换它,该怎么办?

所以...接下来

  

我应该使用WCF吗?如果这在IIS下运行,我是否会遇到aspnet_wp.exe回收问题并将我的进程超时?

您可能可以创建一个WCF服务,它接收一些二进制数据,然后将其存储到数据库中。这个请求可能是异步的。是。但是为了什么?

再一次: 请让我们更深入地了解您的工作流程:您究竟想要实现的目标是什么?您有哪些“环境条件”(例如,应用程序A轮询数据库并期望表x中引用的文件记录被保留)...

修改
所以你想导入一个.csv - 文件。这改变了一切:)

但我不会建议你使用wcf-service(可以是一种用法:例如.wcf-service,它有一个插入单行的方法,然后你的迭代通过该文件将在另一个应用程序中实现...但不是那么好。

我建议遵循:
首先要做你webapp中的所有事情(就像你已经做过的那样),而是使用某种批量插入并在数据库上进行转换/逻辑。

如果你有某种瓶颈,我会建议你做一些像小工作的服务,例如:

webapp将上传文件并在作业表中插入一行。工作服务是连续轮询表/或通过webapp获取wcf的信息(嘿,嘿,最后在你的场景中对WCF的一些用法... :)然后做导入工作,写完成 - 表格注释/或将工作状态设置为完成...
但这有点矫枉过正:)

答案 1 :(得分:1)

请查看我的以下评论是否有助于您解决问题:

•我可以/我应该使用Windows服务吗?如果是这样,怎么样?

  
    

是的,您可以使用Windows服务执行此操作。我认为这就是你应该这样做的方式。您可以实施自己的服务来处理您的请求,也可以使用开源代码Job Proccessor

  

基本上这个想法是......

  • 您提交处理请求 数据库表中的csv文件 某些状态尚未开始。
  • 然后你的Windows服务就开始了 来自数据库表的请求 没有启动并更新它们 进展状况。
  • 处理完成后 你的成功/不成功 service更新了数据库表 状态为已完成/失败。
  • 您的asp.net页面可以查询到 数据库表为当前状态 每隔5秒左右。

•我应该使用WCF吗?如果这在IIS下运行,我是否会遇到aspnet_wp.exe回收问题并将我的进程超时?

  
    

你不应该为此目的使用WCF。