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

Blazor WebAssembly中ReadFromJsonAsync报错:'<'是无效值起始

问题排查与解决方案

核心原因分析

控制台报错'<'是无效值起始,本质是API返回的不是预期的JSON格式,而是以<开头的HTML内容(比如错误页面、MVC视图甚至静态HTML)——哪怕HTTP状态码显示200 OK,实际响应体是HTML而非JSON,导致ReadFromJsonAsync反序列化失败。

具体排查步骤

  • 检查API路由匹配
    确认GetBlogPostByUrl调用的API端点路由是否正确。比如后端API控制器路由是[Route("api/[controller]")],但前端请求的是/Blog/GetByUrl/{url},可能误匹配到MVC默认路由(返回HTML页面)而非API路由。直接在浏览器开发者工具的网络面板查看该请求的响应体,就能判断返回的是HTML还是JSON。
  • 验证API返回内容
    在后端GetBlogPostByUrl方法加断点,确认返回的是BlogPost对象而非ViewResult或其他HTML相关结果。比如ASP.NET控制器如果继承了Controller而非ControllerBase,可能错误返回视图HTML;或者方法内的错误处理逻辑返回了HTML页面。
  • 确认URL参数传递与编码
    虽然你验证了URL正确,但导航到详情页时,URL参数是否被正确绑定?比如详情页的[Parameter]属性是否正确定义,特殊字符是否做了URL编码/解码处理——如果参数编码错误,API请求的URL和数据库存储的不一致,可能触发后端返回错误HTML。
  • 检查请求/响应的Content-Type
    前端调用API时,确认请求的Accept头是application/json;后端返回的Content-Type头是application/json。如果后端返回text/html,哪怕内容是JSON(概率极低),也会导致反序列化失败,更常见的是直接返回HTML。

修复示例

后端API控制器修正

确保API控制器继承ControllerBase,并正确返回JSON格式结果:

[ApiController]
[Route("api/blog")]
public class BlogController : ControllerBase
{
    private readonly BlogDbContext _context;

    public BlogController(BlogDbContext context)
    {
        _context = context;
    }

    [HttpGet("getbyurl/{url}")]
    public async Task<IActionResult> GetBlogPostByUrl(string url)
    {
        var post = await _context.BlogPosts.FirstOrDefaultAsync(p => p.Url == url);
        if (post == null)
        {
            return NotFound(); // 返回404状态码,而非HTML错误页
        }
        return Ok(post); // 自动序列化为JSON,Content-Type为application/json
    }
}

前端请求逻辑修正

在BlogService里添加响应类型校验,提前排查非JSON响应:

public async Task<BlogPost> GetBlogPostByUrl(string url)
{
    var encodedUrl = Uri.EscapeDataString(url);
    var response = await _httpClient.GetAsync($"api/blog/getbyurl/{encodedUrl}");
    
    if (!response.IsSuccessStatusCode)
    {
        throw new HttpRequestException($"请求失败,状态码:{response.StatusCode}");
    }

    // 校验响应内容类型
    var contentType = response.Content.Headers.ContentType?.MediaType;
    if (contentType != "application/json")
    {
        var rawContent = await response.Content.ReadAsStringAsync();
        throw new InvalidOperationException($"预期JSON响应,但收到{contentType},内容:{rawContent}");
    }

    return await response.Content.ReadFromJsonAsync<BlogPost>();
}

快速验证方法

直接在浏览器地址栏输入API请求地址(比如https://你的域名/api/blog/getbyurl/你的文章URL),查看返回的是JSON还是HTML。如果是HTML,说明后端路由或返回结果有问题;如果是JSON,再检查前端模型与JSON结构是否匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 12:20:13