为什么HttpClient.GetFromJsonAsync在响应是HTML而不是JSON时不抛出异常?

bqf10yzr  于 2023-07-01  发布在  其他
关注(0)|答案(1)|浏览(115)

我在学Blazor我已经创建了一个Blazor WASM应用程序与“ASP.NET核心托管”选项。所以我在解决方案中有三个项目:客户端、服务器和共享。
下面的代码在Client项目中,当端点正确时(显然)可以完美工作。但是在某个时候我犯了一个错误,把请求URI搞砸了,然后我注意到API返回了一个HTML页面,代码为200 OK(正如你在代码下面的Postman截图中看到的那样)。
我希望我的一个try-catch得到这个,但是调试器跳转到最后一行(返回null),没有抛出异常。
我的第一个问题是为什么?
我的第二个问题是,我如何才能抓住这个机会?
我知道修复端点可以修复所有问题,但如果有一个catch在我输入URI时提醒我,那就更好了。
谢谢

private readonly HttpClient _httpClient;
public async Task<List<Collaborator>> GetCollaborators()
{
    string requestUri = "api/non-existent-endpoint";
    try
    {
        var response = await _httpClient.GetFromJsonAsync<CollaboratorsResponse>(requestUri);
        if (response == null) 
        {
            // It never enters here. Jumps to the last line of code.
        }
        return response.Collaborators;
    }
    catch (HttpRequestException)
    {
        Console.WriteLine("An error occurred.");
    }
    catch (NotSupportedException)
    {
        Console.WriteLine("The content type is not supported.");
    }
    catch (JsonException)
    {
        Console.WriteLine("Invalid JSON.");
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    return null;
}

jhiyze9q

jhiyze9q1#

使用GetFromJsonAsync从来都不是一个好主意。你不是第一个问这种奇怪行为的人。尝试使用GetAsync。至少你会知道,发生了什么事。

var response = await client.GetAsync(requestUri);
if (response.IsSuccessStatusCode)
{
    var stringData = await response.Content.ReadAsStringAsync();
    var result = JsonConvert.DeserializeObject<CollaboratorsResponse>(stringData);
    ... your code
} 
else
{
    var statusCode = response.StatusCode.ToString(); // HERE is your error status code, when you have an error
}

相关问题