簡體   English   中英

.Net Core 處理從 web api 返回的異常

[英].Net Core Handle exceptions that returned from web api

我使用.Net 5.0 作為后端,使用.Net 5.0 作為客戶端。

我想知道如何在客戶端處理從 web api 返回的異常並將它們顯示給客戶端。

api 異常結果如下:

{
  "Version": "1.0",
  "StatusCode": 500,
  "ErrorMessage": "User not found!"
}

如何在客戶端全局處理此類異常(使用.Net Core MVC)?

根據您的描述,我建議您可以在服務器端使用 try catch 來捕獲異常並作為 json 響應返回。

在客戶端,您可以使用反序列化響應並創建一個名為 Error 的新視圖來顯示響應消息。

更多細節,您可以參考以下代碼:

錯誤 Class:

public class APIError
{
    public string Version { get; set; }
    public string StatusCode { get; set; }
    public string ErrorMessage { get; set; }
}

API:

[HttpGet]
public IActionResult Get()
{
    try
    {
        throw new Exception("UserNotFound");
    }
    catch (Exception e)
    {

        return Ok(new APIError { Version="1.0", ErrorMessage=e.Message, StatusCode="500" });
    }


}

應用:

       var request = new HttpRequestMessage(HttpMethod.Get,
"https://localhost:44371/weatherforecast");


        var client = _clientFactory.CreateClient();

        var response = await client.SendAsync(request);

        if (response.IsSuccessStatusCode)
        {
             var responseStream = await response.Content.ReadAsStringAsync();
            APIError re = JsonSerializer.Deserialize<APIError>(responseStream, new JsonSerializerOptions
            {
                PropertyNameCaseInsensitive = true,
            });

            if (re.StatusCode == "500")
            {

                return View("Error", new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier, Version = re.Version, StatusCode = re.StatusCode, ErrorMessage = re.ErrorMessage });

            }


        }
        else
        {
            // Hanlde if request failed issue
        }

注意:我新建了一個錯誤視圖,你可以自己創建或者修改默認的錯誤視圖。

錯誤視圖模型:

public class ErrorViewModel
{
    public string RequestId { get; set; }

    public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);

    public string Version { get; set; }
    public string StatusCode { get; set; }
    public string ErrorMessage { get; set; }
}

錯誤視圖:

@model ErrorViewModel
@{
    ViewData["Title"] = "Error";
}

<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>

@if (Model.ShowRequestId)
{
    <p>
        <strong>Request ID:</strong> <code>@Model.RequestId</code>
    </p>
}

<h3>@Model.StatusCode</h3>
<p>
    @Model.ErrorMessage
</p>
 

結果:

在此處輸入圖像描述

如果您不想在后端使用異常,您可以將 http 狀態碼發送給客戶端。 這是通過服務聯系外部 api 並將該狀態返回到后端 controller 的示例。 然后,您只需通過客戶端獲取此結果。 如果需要,您也可以只向客戶端發送完整的 http 響應,而不是僅發送 HttpStatusCode。

在這里更詳細一點: https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/calling-a-web-api-from-a-net-client

//Backend Service..
private const string baseUrl = "https://api/somecrazyapi/";

public async Task<HttpStatusCode> GetUserStatusAsync(string userId)
{
    var httpResponse = await client.GetAsync(baseUrl + "userId");
    return httpResponse.StatusCode;
}

//Backend Controller
[ApiController]
[Route("[controller]")]
public class UserController
{
    private readonly IUserService service;
    public UserController(IUserService service)
    {
        this.service = service;
    }

    ......

    [HttpGet("{userId}")]
    public HttpStatusCode GetUserStatus(string userId)
    {
        return service.GetUserStatusAsync(userId).Result;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM