c# - ASP.Net Architecture 解决方案/建议

标签 c# asp.net wcf architecture windows-services

作为应用程序架构的一部分,我们有 3 个组件; ASP.Net Web、WCF 服务和 Windows 服务。

  1. 调用 WCF 执行任务的 ASP.Net Web 应用程序。

  2. WCF 实习生触发正在运行的 Windows 服务来执行任务。 Windows 服务实习生开启多个线程来执行任务。

  3. Windows 服务使用任务的进度状态更新数据库,Web 应用程序读取状态更新给用户。 Web 应用程序由单独的团队开发,而其他团队负责 WCF 和 Windows 服务。

开发 Windows 服务而不仅仅是 WCF 的原因是需要打开多个线程作为任务完成的一部分。由于 WCF 只能用作 web 应用程序的 fire and forget,因此其他团队决定使用 Windows 服务。此外(根据其他团队的研究)在 WCF 中退出任务时不可能关闭所有线程。

  1. 这是一个好的架构吗?
  2. 可以调用 Windows 服务来执行来自 WCF 的任务吗?
  3. 是否可以在不使用 Windows 服务的情况下构建此应用程序?

最佳答案

Is this a good architecture?

同意其他评论者的观点,您可以使用类似 hangfire 的方法在 ASP.NET 中完成整个解决方案来处理后台任务。

我在我当前的项目中使用这个框架来处理不同类型的长时间运行的任务,它非常可靠,特别是与某种客户端通知库结合使用,如 angular toasty指示后台任务的状态。

Is it OK to call windows service to perform the task from WCF?

这在技术上没有任何问题,但您最好在 Windows 服务中托管 WCF 服务,而不是将它们分开。只是另一个没有实际 yield 的事件部分。

Is it possible to architect this application without using windows service ?

见上文。

来自评论:

Unfortunately the task that gets initiated from asp.net application might go on from 10 minutes to 1+ hr

我们的一些后台任务需要超过 30 分钟,但还没有一个需要一个小时。虽然不能保证 IIS 工作线程会挂起足够长的时间来完成工作,但 hangfire 提供了一个铁定的保证,即无意中卸载的工作将重新运行并最终成功。这是自动的,不需要额外的配置。

also user needs to get status update on progress of the task.

正如我在最初的回答中所说,我们通过客户端轮询实时提供状态指示(作业类型、已用时间、预计完成时间等)。我们实际上轮询 hangfire 数据库(不是推荐的方法,但对我们来说足够安全),但您也可以点击内存中的 hangfire 作业管理器来检索此信息(这是推荐的方法)。

Looks like HangFire is more like fire and forget

Hangfire 绝对是即发即弃,但这正是它强大的原因,并且应该成为任何后台任务运行器实现的一个特性。在我看来,等待某种完成回调事件是棘手且令人不快的。

关于c# - ASP.Net Architecture 解决方案/建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30267493/

相关文章:

wcf - 如何修复 WCF 的循环引用问题

c# - 我应该如何在 C# 中使用 debug.print

c# - 无需反射即可将 get/set 属性作为参数传递的最佳方法

javascript - Telerik 的 RadSpell 的 StartSpellCheck 错误

asp.net - web.config 从 SQL Server 更改为 MySQL 连接

c# - 带附加参数的 WCF REST 文件上传

c# - Base64图片转WPF图片源错误 No imaging component suitable

c# - 如何获取 DataGridView 控件上滚动条的大小?

c# - 在 ASP.NET Core 中未经授权时重定向到登录

wcf - 可以将自定义 UserNamePasswordValidator 用作角色提供者吗?