在dotnet核心中终止恶意线程

时间:2019-07-16 14:02:12

标签: .net-core thread-abort

由于dotnet core 2.1不支持线程中止,如何解决自托管dotnet core应用程序中的恶意请求处理?

背景

我用HttpListener在dotnet核心中运行了一个自托管的Web api(在Windows中似乎运行在http.sys之上)。
HttpListener将每个传入的请求推送到在另一个线程中运行的HttpRequestHandler。
这使我可以处理多个并发请求,而不必彼此等待。

while (...)
{
    HttpListenerContext context = httpListener.GetContext(); // waits for incoming request
    Task.Factory.StartNew(() => {
        new HttpHandler().ProcessRequest(context);
    });
}

我假设使用.net框架和IIS,IIS会将HttpContext传递给应用程序,然后将其路由到单独线程中的特定RequestHandler。
然后,应用程序将监视线程,并在超过超时设置的情况下终止线程,从而导致HttpException(请求超时)。

但是在dotnet core 2.1中,在监视并确定线程运行时间过长之后,我无法中止线程,因为Thread.Abort()未在dotnet core中实现。

现在,我有一个运行多个服务的应用程序,并且每个服务都由具有不同技能水平的各种开发人员使用。 尽管有同行评审,测试等,但生产中的请求仍可能遇到无限循环,导致其线程无响应。
如果有足够多的请求挂起,则随机服务中的一个简单小错误可能会导致整个应用程序崩溃。

如何让dotnet核心处理不响应的线程而不必重新启动整个应用程序?
其他自托管的dotnet核心“网络服务器”(例如Kestrel)将如何处理?或者不是吗?

我应该使用工作进程并使用进程间通信将HttpContext中继到工作进程吗?如果是这样,我如何才能做到这一点?

0 个答案:

没有答案