我正在设计一个新的软件解决方案,其中包括一个在IIS中托管的.NET web应用程序,用户可以从该应用程序中触发各种功能(同样,必须是.NET代码),以便在后台异步执行。我正在寻找合适的技术和架构来实现这一点。需要支持的一些重要特性是:
如果后台功能是通过在IIS实例中启动一个新线程来实现的,这将使#1易于实现。然而,为了支持#2和#3,必须编写特殊的代码,而且似乎许多人认为,托管后台功能需要能够从崩溃中恢复或在将来被安排在Web应用程序中,这是错误的做法。
另一种选择是在windows服务中承载后台进程。如果是,那么解决#1、#2和#3的最好方法是什么?这一切仍然需要自定义代码-那么是否有可用的软件来处理这些需求?
发布于 2014-02-27 10:08:02
在这种情况下,在IIS中托管一个web应用程序将只占问题的10% .HTTP是无状态且无连接的。因此,如果浏览器不请求任何内容,IIS (因此是ASP.NET应用程序)将无法响应。我所面临的类似情况被修正如下:
现在需要在Web和Web之间共享数据的重要方面。只需使用一个数据库来更新与给定的唯一ID对应的状态。当用户请求更新Web应用程序中的唯一ID时,它可以轻松地获取更新信息并将其发送回最终用户。
发布于 2014-02-27 10:06:58
最佳做法是将处理分开。即,从网站开始处理,将请求放入队列(例如数据库表),并使用单独的工作人员服务,该服务轮询任务队列,并仅在成功完成任务时标记任务(例如,将结果放入另一个表,或将已完成的列标记为真),然后使用单独的服务/网站轮询结果并通知用户。
如果员工服务崩溃/失败,它不应该将队列项标记为已完成,而且每当它重新启动时,它可以轻松地再次轮询未完成的任务队列。
发布于 2014-02-27 10:32:36
IIS的丑陋之处在于,IIS会在一段时间后终止其工作进程。有一些视图技巧可以避免这种情况,但是实际上,如果您想拥有一个可靠的基础设施,正如前面提到的,您应该将这些代码放在windows服务中,并通过WCF与您的web应用程序进行通信。您需要后台的数据库来存储您的任务,以便在计算机关闭或服务崩溃后重新安排它们。
我们正在为这类问题构建一个框架,但尚未完全发布。它允许在windows服务或Linux (使用MONO)中托管排队/预定的工作。它具有维护子进程的能力,因此如果子进程崩溃,它可以自动重新启动。由于父进程是服务或deamon,它将被启动并与计算机一起关闭。与承载此进程的IIS不同,此进程永远不会自动终止,并且不能保持活动状态。
父/子进程管理是开源的,在这里可以获得:
http://www.nuget.org/packages/ChildProcesses/
http://childprocess.codeplex.com/
该框架本身称为,但目前只发布了工作流引擎。服务、模块管理、WCF模块、数据库连接器等将很快发布。在这里可以找到:
http://www.crawler-lib.net/
https://stackoverflow.com/questions/22064820
复制相似问题