如何在返回对象的ASP.NET Core WebAPI控制器中引发异常?

里安斯

在Framework WebAPI 2中,我有一个如下所示的控制器:

[Route("create-license/{licenseKey}")]
public async Task<LicenseDetails> CreateLicenseAsync(string licenseKey, CreateLicenseRequest license)
{
    try
    {
        // ... controller-y stuff
        return await _service.DoSomethingAsync(license).ConfigureAwait(false);
    }
    catch (Exception e)
    {
        _logger.Error(e);
        const string msg = "Unable to PUT license creation request";
        throw new HttpResponseException(HttpStatusCode.InternalServerError, msg);
    }
}

果然,我收到该消息的500错误。

如何在ASP.NET Core Web API中执行类似的操作?

HttpRequestException似乎不存在。我希望继续返回该对象而不是HttpRequestMessage

那这样的事呢 创建一个中间件,在其中您将暴露某些异常消息:

public class ExceptionMiddleware
{
    private readonly RequestDelegate _next;

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

    public async Task Invoke(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        catch (Exception ex)
        {
            context.Response.ContentType = "text/plain";
            context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;

            if (ex is ApplicationException)
            {
                await context.Response.WriteAsync(ex.Message);
            }
        }
    }
}

在您的应用中使用它:

app.UseMiddleware<ExceptionMiddleware>();
app.UseMvc();

然后在您的操作中引发异常:

[Route("create-license/{licenseKey}")]
public async Task<LicenseDetails> CreateLicenseAsync(string licenseKey, CreateLicenseRequest license)
{
    try
    {
        // ... controller-y stuff
        return await _service.DoSomethingAsync(license).ConfigureAwait(false);
    }
    catch (Exception e)
    {
        _logger.Error(e);
        const string msg = "Unable to PUT license creation request";
        throw new ApplicationException(msg);
    }
}

更好的方法是返回IActionResult这样,您就不必抛出异常。像这样:

[Route("create-license/{licenseKey}")]
public async Task<IActionResult> CreateLicenseAsync(string licenseKey, CreateLicenseRequest license)
{
    try
    {
        // ... controller-y stuff
        return Ok(await _service.DoSomethingAsync(license).ConfigureAwait(false));
    }
    catch (Exception e)
    {
        _logger.Error(e);
        const string msg = "Unable to PUT license creation request";
        return StatusCode((int)HttpStatusCode.InternalServerError, msg)
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在ASP.NET Core WebApi控制器中获取当前登录的用户

ASP.Net Core WebApi-存储来自ActionFilter的值以在控制器中访问

如何对返回匿名对象的ASP.NET Core MVC控制器进行单元测试?

如何在.NET Core中测试控制器

如何从控制器传递对象并在 ASP.Net Core 中的视图上使用它

如何在ASP.net Core中的控制器中检索JSON数据?

如何在 .net core 中的控制器的新类对象中提供 ILogger<ClassName> 实例?

在.Net Core中测试控制器始终返回false?

如何在 ASP.NET Core 中检索控制器类型?

我如何在Asp.net Core MVC的控制器中获得自己的用户

如何在ASP.NET Core API中更改默认控制器和操作?

如何在 ASP.NET Core 控制器中接收“multipart/mixed”

如何在Asp.Net Core中制作可重用的控制器

如何在ASP.NET Core Swagger(Swashbuckle.AspNetCore)中定义控制器描述?

如何在 ASP Net Core 中授权 Web API 控制器

覆盖ASP.NET Core中的控制器名称

ASP.NET Core中的ExceptionFilterAttribute访问控制器

ASP .NET Core中的自动控制器检测

从.NET Core控制器返回CSV

从ASP.NET Core 2控制器返回PDF

如何在 Asp.NET Core MVC 应用程序中将 Json 返回从控制器发送到前端?

ASP.NET Core 3.0配置控制器以返回pascal大小写对象

从ASP.NET Core MVC中的控制器返回Pdf文档

控制器动作如何调用Asp .Net Core?

如何在 ASP.NET Core Identity 中控制器的构造函数中获取登录用户名

如何从ASP.NET Core AJAX表单从控制器访问返回的json数据?

ASP.NET Core-如何在另一个控制器中重用在一个控制器中创建的方法?

如何从C#.NET Core WebAPI控制器向SPA返回2个文档(PDF和XFDF)?

如何从ASP.NET Core中的约定中删除控制器