c# - 如何捕获线程中发生的 Asp.net 核心中的异常

标签 c# asp.net-core task

有些任务我附加了一个 Action 。我有一个用于观察所有异常的中间件。现在,线程异常出现了问题。我已经在操作主体中手动抛出异常,但当我抛出异常时,应用程序进入中断模式状态,我无法监视异常。

在配置mvc之前,我把我的错误处理中间件

public class ErrorHandlingMiddleware
{
    private readonly RequestDelegate next;

    public ErrorHandlingMiddleware(RequestDelegate next)
    {
        this.next = next;
    }

    public async Task Invoke(HttpContext context /* other dependencies */)
    {
        try
        {
            await next(context);
        }
        catch (Exception ex)
        {
            await HandleExceptionAsync(context, ex);
        }
    }

    private static Task HandleExceptionAsync(HttpContext context, Exception exception)
    {
        var code = HttpStatusCode.InternalServerError; 

        var result = JsonConvert.SerializeObject(new { error = exception.Message });
        context.Response.ContentType = "application/json";
        context.Response.StatusCode = (int)code;
        return context.Response.WriteAsync(result);
    }
}
//and this is the piece of code that run all tasks. 
foreach (var item in BotList)
{
            BotHandler BotObject = new BotHandler(item,conn);
            Task.Run(() => { BotObject.Run();});
}      
//

  public void Run()
    {

        //BotClient.StopReceiving();
        BotClient.OnMessage += BotOnMessageReceived;
        BotClient.OnMessageEdited += BotOnMessageReceived;
        BotClient.OnCallbackQuery += BotOnCallbackQueryReceived;

    }
     private async void BotOnMessageReceived(object sender, MessageEventArgs messageEventArgs)
    {
       try
           {
              //do something
                string a = null;
                var b = a.ToString();
           }
       catch(Exception exp )
       {
         throw exp
       }
    }
}

最佳答案

据我了解,您在 Controller 的操作中运行此代码:

//and this is the piece of code that run all tasks. 
foreach (var item in BotList)
{
            BotHandler BotObject = new BotHandler(item,conn);
            Task.Run(() => { BotObject.Run();});
}  

主要问题是您正在尝试为已经完成的请求运行任务。这就是为什么 ExceptionHandlingMiddleware(实际上还有其他中间件)无法处理任何事情的原因。要解决您的问题,您可以添加 try/catch block 来处理意外异常。

我强烈建议不要在 HTTP 请求期间启动后台任务。这是一种容易出错的方法,因为任务可能随时关闭而您甚至不会注意到。除了这种方法,最好使用后台任务(msdnSO Discussion)、某种 AWS lambda/Azure 函数或其他任务计划程序。

如果您需要在调用 HTTP 方法后进行一些重新计算工作,您可以考虑使用异步消息处理来触发该过程。

关于c# - 如何捕获线程中发生的 Asp.net 核心中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53980815/

相关文章:

swift - 使用任务返回 UIImage 异步

c# - 如何使类线程安全

c# - Dotnet Core 默认使用哪个 appsettings.json 文件,环境文件还是父文件?

c# - 比较两个序列是否相等

asp.net-core - 从 Identity Server 4 重定向不适用于 .net core 2.2

C#、MVVM、任务和 UI 线程

c# - 当 regex101 匹配时,RegEx C# 不匹配

c# - 如何手动设置程序集版本

c# - 同一 Controller 中的 AmbiguousActionException

c# - Task.Run(()=> DoWorkAsync()) 和 new Thread(async()=> DoWorkAsync()); 之间的区别