首页 > 解决方案 > c#MVC总是运行线程?

问题描述

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

我编写了一个 Windows 服务(c# .net 4.7),它创建一个到我的警报面板的 TcpClient 连接并监听传入的数据,然后将数据转发到我用来连接其他服务的网站。为了可靠性,我想将此功能移植到 ac#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();
    }

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

提前致谢!

标签: c#asp.netasp.net-mvcvb.net

解决方案


如果您需要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


推荐阅读