如何正确处理ASP.NET Core中间件中的错误?

时间:2017-12-15 14:32:02

标签: asp.net-core async-await .net-core asp.net-core-mvc asp.net-core-2.0

我创建了一个HandlerMiddleware类,它为特定的URL执行处理程序。

using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;


namespace FailTest
{


    public interface IHttpHandler
    {
        bool IsReusable { get; }
        void ProcessRequest(HttpContext context);
    }


    public abstract class HandlerMiddleware<T> 
        where T : IHttpHandler
    {
        private readonly RequestDelegate _next;

        public HandlerMiddleware() 
        { }

        public HandlerMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext context)
        {
            try
            {
                await SyncInvoke(context);
            }
            catch (System.Exception ex)
            {
                System.Console.WriteLine(ex.Message);
                throw;
            }


        }

        public Task SyncInvoke(HttpContext context)
        {
            try
            {
                // IHttpHandler handler = (IHttpHandler)this;
                T handler = System.Activator.CreateInstance<T>();
                handler.ProcessRequest(context);
            }
            catch (System.Exception ex)
            {
                System.Console.WriteLine(ex.Message);
                throw;
            }


            return Task.CompletedTask;
        }
    } // End Abstract Class HandlerMiddleware


}

现在我有一个实现处理程序的类,例如

[HandlerPath("/treedata", "GET,POST")]
public class SomeFailingTask
    : HandlerMiddleware<SomeFailingTask>, IHttpHandler 
{
    public SomeFailingTask() : this(null)
    { }

    public SomeFailingTask(RequestDelegate next) : base(next)
    { }

    bool IHttpHandler.IsReusable
    {
        get { throw new System.NotImplementedException(); }
    }

    void IHttpHandler.ProcessRequest(HttpContext context)
    {
          // Do something in DB and return result as JSON
          // e.g. SQL with invalid syntax, or a missing parameter
    }
}

只要ProcessRequest中没有错误,它就可以正常工作。 但是当在ProcessRequest中抛出异常时,它会使用HTTP 200 OK完成请求。

我做错了什么? 我在Invoke和SyncInvoke中都得到了异常,但HTTP请求总是完成,好像一切都很好......

0 个答案:

没有答案