You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让HttpClient.GetFromJsonAsync()的第二个调用正常工作?

问题解决:Blazor调用返回字符串的API接口失败

问题场景

Blazor页面中有两个API调用,第一个正常工作,第二个抛出JSON解析异常:

private async void SelectQuiz()
{
    List<String>? ls  = await httpClient.GetFromJsonAsync<List<String>>("api/BgQuizAnswer/GetBgQuizList");
    String?       txt = await httpClient.GetFromJsonAsync<String>      ("api/BgQuizAnswer/GetHello");
}

后端对应接口代码:

[HttpGet]
[Route("GetBgQuizList")]
public ActionResult<List<String>> GetBgQuizList()
{
    return _bgQuizAnswerService.GetBgQuizList();
}
[HttpGet]
[Route("GetHello")]
public ActionResult<String> GetHello()
{
    return "Hello";
}

报错信息:

未处理的异常:
System.Text.Json.JsonException: 'H' 是无效的值起始字符。路径: $ | LineNumber: 0 | BytePositionInLine: 0。
---> System.Text.Json.JsonReaderException: 'H' 是无效的值起始字符。LineNumber: 0 | BytePositionInLine: 0。

错误原因

GetFromJsonAsync方法要求后端返回标准JSON格式的数据。你的GetHello接口直接返回纯文本Hello,而合法的JSON字符串必须被双引号包裹(例如"Hello")。解析器读取到无引号的H时,会判定为无效的JSON起始字符,从而抛出异常。

解决方案

提供两种可行方案,任选其一即可:

方案1:前端改用纯文本接收

既然后端返回的是纯文本,直接使用GetStringAsync替代GetFromJsonAsync:

String? txt = await httpClient.GetStringAsync("api/BgQuizAnswer/GetHello");

方案2:修改后端返回标准JSON格式

让ASP.NET Core返回合法的JSON字符串,有两种实现方式:

  • 方式A:显式返回序列化后的JSON字符串
[HttpGet]
[Route("GetHello")]
public ActionResult<String> GetHello()
{
    return Json("Hello");
}
  • 方式B:返回包含字符串的对象(更符合REST API规范)
[HttpGet]
[Route("GetHello")]
public ActionResult<object> GetHello()
{
    return new { Message = "Hello" };
}

此时前端需要对应修改接收逻辑:

var result = await httpClient.GetFromJsonAsync<dynamic>("api/BgQuizAnswer/GetHello");
String? txt = result.Message;

内容的提问来源于stack exchange,提问作者Hal Heinrich

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 04:52:40