【问题标题】:c# MVC always running thread?c#MVC总是运行线程?
【发布时间】:2018-11-01 13:58:34
【问题描述】:

首先,如果这是一个重复的问题,我提前道歉。

我编写了一个 Windows 服务 (c# .net 4.7),它创建一个到我的警报面板的 TcpClient 连接并侦听传入数据,然后将数据转发到我用来连接其他服务的网站。为了可靠性,我想将此功能移植到 c# MVC 网站,以便我可以监控它的状态(确保它仍然连接,警报没有响起等)。

我开始创建一个 MVC 项目并在 global.asax 文件中启动一个新线程,该线程加载/运行我最初为 winService 创建的类。

Application["MyTcpClass"] = new MyTcpClass();

然后在我的 HomeController 中,我添加了一个 Poll() ActionResult:

    public void Poll()
    {
        MyTcpClass objClass = (MyTcpClass)Application["MyTcpClass"];
        //If objClass is null, recreate/reconnect it
        objClass.Poll();
    }

在我进一步开始添加返回状态等的方法之前,我想与大家核实一下这是否是一个好方法和/或是否有更好的方法?

提前致谢!

【问题讨论】:

  • “我开始一个新线程”不,不是一个好主意。不要在 ASP.NET 中创建自己的线程。
  • 同意,我知道在 asp.net 中创建后台任务/线程/作业有点超出 asp.net 可以做的范围,但我需要这个 TCP 连接尽可能接近尽可能永久(Poll() actionresult 的一部分是在断开连接时重新连接)

标签: c# asp.net asp.net-mvc vb.net


【解决方案1】:

如果您需要在后台保持自定义 TcpClient 处于打开状态,最好将其作为 Windows 服务保留。 ASP.NET 只会让它复杂化。

首先(假设您将它托管在 IIS 中),默认情况下,如果网站在 20 分钟内没有收到任何传入请求,IIS 将关闭网站。您可以完全关闭该行为,但期望 IIS 让您的应用程序保持 100% 的时间运行仍然是不可靠的。网站旨在响应 HTTP 请求,而不是运行后台任务。

如果您想创建一个可以检查您的服务在做什么的网站,那么一种方法是在您的服务中使用HttpListener 来创建您的 Web 应用程序可以调用的 Web 服务。我以前在我从事的一个项目中做过这个。这里有一个如何使用它的例子:https://www.codeproject.com/Articles/599978/An-HttpListener-Server-for-Handling-AJAX-POST-Requ

更新:我发现这个例子太忙了,所以我根据我过去做的项目创建了自己的例子:http://www.gabescode.com/dotnet/2018/11/01/basic-HttpListener-web-service.html

【讨论】:

  • 感谢 Gabriel - 您链接到的 HttpListener“网络服务器”类似于我为 Windows 服务编写的代码。我正在寻找的是是否/如何将其移植到 asp.net/MVC 网站。在不同于 Web 服务的新线程中启动类/对象的网页有什么区别?
  • @Losbear 网页和网络服务在这个意义上并没有什么不同 - 不同之处在于您托管它的方式。 Gabriel 建议将 Web 界面托管在 Windows 服务中,您可以在其中控制任何线程的生命周期等。问题在于 IIS,而不是 MVC(严格来说)。
  • 我建议你有两个部分:1. 执行后台任务的 Windows 服务 有一个 Web 服务,以及 2. 一个网站(如 ASP.NET MVC),它通过 Web 服务与您的 Windows 服务进行通信。
  • @Luaan 有正确的想法。这只是 IIS 的问题。它控制其托管的每个网站的进程,因此很难保证您的应用程序将始终在后台运行。
  • 我得到了你们所说的一切:IIS 等。我真的试图避免让 Windows 服务在本地运行,以防运行它的计算机发生问题。正在考虑 ping 我想要创建的这个网站的第 3 方监控服务会使其保持活力(大约每分钟一次)。但这可能是让它可靠工作的唯一方法。
猜你喜欢
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 2013-09-20
  • 1970-01-01
  • 2012-07-21
  • 2018-11-21
  • 2018-01-14
相关资源
最近更新 更多