C# vNext MVC 6 Web Api中返回验证错误

C# vNext MVC 6 Web Api中返回验证错误,c#,asp.net,asp.net-mvc,asp.net-core,C#,Asp.net,Asp.net Mvc,Asp.net Core,在我的服务代码中,我正在验证我的对象,如果它失败,它会抛出ValidationException(使用FluentValidation),这反过来会抛出一个异常,错误代码为500 在不检查我所有的方法并添加try..catch的情况下,是否可以在mvc管道中添加一些内容,以查看是否抛出了ValidationException,如果抛出了ValidationException,则返回带有ValidationException消息的BadRequest 如果我要更新我所有的方法,它会像这样 try

在我的服务代码中,我正在验证我的对象,如果它失败,它会抛出ValidationException(使用FluentValidation),这反过来会抛出一个异常,错误代码为500

在不检查我所有的方法并添加try..catch的情况下,是否可以在mvc管道中添加一些内容,以查看是否抛出了ValidationException,如果抛出了ValidationException,则返回带有ValidationException消息的BadRequest

如果我要更新我所有的方法,它会像这样

try
{
    await _service.AddAsync(entity);

    // return created response
    return Created(_httpContextAccessor.HttpContext.Request.GetDisplayUrl(), _mapper.Map<DatasheetModel>(entity));
}
catch (ValidationException e)
{
    return BadRequest(e.Message);
}
试试看
{
wait_service.AddAsync(实体);
//返回创建的响应
已创建的返回(httpContextAccessor.HttpContext.Request.GetDisplayUrl(),mapper.Map(实体));
}
捕获(ValidationException e)
{
返回请求(e.Message);
}

这是可能的、推荐的,还是我应该像上面那样更新我的所有方法?

您不必到处尝试。您可以创建异常处理中间件并将其注入Http管道。中间件是ASP.NET核心的主要概念之一。我在GitHub上发布了一个RC1项目,它演示了如何通过三个简单的步骤创建中间件。你可以下载它。自述文件将解释如何在项目中搜索代码的相关区域


我还发布了一个项目,演示了如何开发自定义异常处理程序中间件。你可以下载这个项目。自述文件将再次解释如何在项目中搜索代码的相关区域。

您不必到处都放try/catch。您可以创建异常处理中间件并将其注入Http管道。中间件是ASP.NET核心的主要概念之一。我在GitHub上发布了一个RC1项目,它演示了如何通过三个简单的步骤创建中间件。你可以下载它。自述文件将解释如何在项目中搜索代码的相关区域


我还发布了一个项目,演示了如何开发自定义异常处理程序中间件。你可以下载这个项目。自述文件将再次解释如何在项目中搜索代码的相关区域。

ASP.NET核心的了不起之处在于,他们将中间件的概念提升到了一个新的层次。这可以通过简单地创建和实现一些功能来实现。中间件能够看到每个请求和相应的响应,并对其进行操作

public class ValidationExceptionMiddleware  
{
    private readonly RequestDelegate _next;

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

    public async Task Invoke(HttpContext context)  
    {
        // Handle exceptions and propagate appropriate response
        await _next.Invoke(context);
    }
}
编写完中间件后,将其添加到
启动中。配置
方法:

public void Configure(IApplicationBuilder app, 
                      IHostingEnvironment env, 
                      ILoggerFactory loggerFactory)  
{
    // Omitted for brevity...
    app.UseMiddleware<ValidationExceptionMiddleware>();
}
public void配置(IApplicationBuilder应用程序,
IHostingEnvironment环境,
伊洛格工厂(伐木厂)
{
//为简洁起见省略。。。
app.UseMiddleware();
}

也有异常过滤器,但这不允许您与请求和响应管道进行交互。

ASP.NET Core的可怕之处在于,它们将中间件的概念提升到了一个新的层次。这可以通过简单地创建和实现一些功能来实现。中间件能够看到每个请求和相应的响应,并对其进行操作

public class ValidationExceptionMiddleware  
{
    private readonly RequestDelegate _next;

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

    public async Task Invoke(HttpContext context)  
    {
        // Handle exceptions and propagate appropriate response
        await _next.Invoke(context);
    }
}
编写完中间件后,将其添加到
启动中。配置
方法:

public void Configure(IApplicationBuilder app, 
                      IHostingEnvironment env, 
                      ILoggerFactory loggerFactory)  
{
    // Omitted for brevity...
    app.UseMiddleware<ValidationExceptionMiddleware>();
}
public void配置(IApplicationBuilder应用程序,
IHostingEnvironment环境,
伊洛格工厂(伐木厂)
{
//为简洁起见省略。。。
app.UseMiddleware();
}

也有异常过滤器,但这不允许您与请求和响应管道进行交互。

@David-该问题涉及ASP.NET之前的Web API 2。这个问题参考的是ASP.NET核心MVC6。所以这两个是完全不相关的。@David-ASP.NET核心是对ASP.NET的完全重写,并删除了System.Web.dll。由于ASP.NET之前的所有核心都基于System.Web.dll,因此它们的工作方式并不相同。用于异常处理的中间件的思想是相同的,period@David-思想可能是相同的,但实现是不同的。您刚才发布的链接中的解决方案使用来自System.Web.dll的IEExceptionHandler。这在ASP.NET Core中不存在。@ClintB这就是为什么我发布并回答了详细介绍ASP.NET Core实现的内容。我确实意识到这是一种重写,它不依赖于
System.Web.dll
。感谢you@David-该问题是指Web API 2,它是ASP.NET之前的核心。这个问题参考的是ASP.NET核心MVC6。所以这两个是完全不相关的。@David-ASP.NET核心是对ASP.NET的完全重写,并删除了System.Web.dll。由于ASP.NET之前的所有核心都基于System.Web.dll,因此它们的工作方式并不相同。用于异常处理的中间件的思想是相同的,period@David-思想可能是相同的,但实现是不同的。您刚才发布的链接中的解决方案使用来自System.Web.dll的IEExceptionHandler。这在ASP.NET Core中不存在。@ClintB这就是为什么我发布并回答了详细介绍ASP.NET Core实现的内容。我确实意识到这是一种重写,它不依赖于
System.Web.dll
。非常感谢。