【问题标题】:Blazor handle the error in the response from Web ApiBlazor 处理来自 Web Api 的响应中的错误
【发布时间】:2019-09-17 07:49:56
【问题描述】:

有两种应用:

  1. Blazor 服务器端
  2. Web API(很久以前写的)

WebApi 操作

public async Task<object> GetAllAsync(...)
{
   ...
   // Какая то проверка
   throw new Exception("Что то пошло не так");
   ...
}

客户端应用程序(Blazor 服务器端)中方法的示例视图

    public async Task GetAllAsync()
    {
            var httpClient = clientFactory.CreateClient();
            var responseMessage = await httpClient.GetAsync($"{address}/api/foo");

            if (responseMessage.IsSuccessStatusCode)
            {
                // successfully
            }
            else
            {
                // How to get the error message here?
            }
        }
    }

问题是:如何正确处理来自 API 的此类错误?

ps

var exception = await responseMessage.Content.ReadAsAsync<HttpError>();

HttpError 使用 .NetFramework 4.6 提取依赖项(但最初我使用 .net core 3 预览版)

【问题讨论】:

  • 您到底想要发生什么?你可以用EnsureSuccessStatusCode()投掷。

标签: c# .net-core blazor


【解决方案1】:

HttpContent 类没有定义 ReadAsAsync 方法。这是一种我认为已过时且不再受支持的扩展方法。您可以使用 ReadAsStringAsync()、ReadAsStreamAsync() 等。

示例如何将异常内容序列化为字符串:

var exception = await responseMessage.Content.ReadAsStringAsync();

以下代码 sn-p 演示了如何使用 HttpContent.ReadAsByteArrayAsync() 将 HTTP 内容作为异步操作序列化为字节数组,然后将数组解析为您可以定义的类型以保存 http 错误(一些类似于 HttpError 对象,你不应该使用它,但更简单)。

var responseBytes = await responseMessage.Content.ReadAsByteArrayAsync();

注意:将类型说明符T更改为您的自定义类型,或者使用字符串等内置类型,根据您的设计...

JsonSerializer.Parse<T>(responseBytes, new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多