Как я могу поймать исключения в ядре Asp.net, которые происходят в потоке - PullRequest
0 голосов
/ 30 декабря 2018

Есть несколько задач, к которым я прикрепил действие.У меня есть промежуточное программное обеспечение для наблюдения за всеми исключениями.Теперь существует проблема с исключением потока.Я уже выдал исключение вручную в теле действия, но когда я выбрасываю исключение, приложение переходит в состояние режима прерывания, и я не могу отслеживать исключения.

Перед настройкой 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
       }
    }
}

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Как я понял, вы запускаете этот код в действии контроллера:

//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 для обработки неожиданного исключения.

Я бы настоятельно рекомендовал не запускать фоновую задачу во время HTTP-запроса.Это подверженный ошибкам подход, поскольку задача может быть закрыта в любое время, и вы даже не заметите.Вместо этого подхода лучше использовать фоновую задачу ( msdn , SO Обсуждение ), какую-то функцию AWS lambda / Azure или другой планировщик задач.

InЕсли после вызова HTTP-метода вам необходимо выполнить какое-либо задание по пересчету, вы можете рассмотреть асинхронную обработку сообщений, чтобы запустить процесс.

0 голосов
/ 31 декабря 2018

если вы зайдете сюда https://msdn.microsoft.com/en-us/magazine/jj991977.aspx, вы прочтете это.

Исключения из метода асинхронной пустоты невозможно обнаружить с помощью Catch

Таквы не можете перехватить исключение (промежуточное программное обеспечение не может), которое вы генерируете в своем методе BotOnMessageReceived (в части Catch).

Таким образом, у вас есть 2 решения.

  1. Удалить ключевое слово async
  2. Или Catch app необработанные исключения, если это возможно.Например, в обычном консольном приложении .net Framework у вас есть событие в приложении, называемое необработанными исключениями, и вы можете обрабатывать такие ситуации, как ваша.

Я также нашел что-то здесь, возможно, это поможет Как перехватить необработанные исключения в ASP .NET Core 2.0 до отображения страницы?

...