Blazor Web Api 返回 text/html 而不是 application/json

Posted

技术标签:

【中文标题】Blazor Web Api 返回 text/html 而不是 application/json【英文标题】:Blazor's WebApi returns text/html instead of application/json 【发布时间】:2020-09-12 14:17:03 【问题描述】:

我的控制器在 Blazor 的服务器端 WebApi 中的方法返回一个 html/text 响应而不是 application/json 这导致 The provided ContentType is not supported; the supported types are 'application/json' and the structured syntax suffix 'application/+json'. 错误。手动设置对 application/json 响应的内容类型的最佳方法是什么?

我的控制器带有 Get 方法

 [Route("api/[controller]")]
[ApiController]
public class DeveloperController : ControllerBase

    private readonly ApplicationDBContext _context;

    public DeveloperController(ApplicationDBContext context)
    
        _context = context;
    

    [HttpGet]
    public async Task<ActionResult> Get()
    
        var devs = await _context.Developers.ToListAsync();
        return Ok(devs);
        
    

以及来自客户端页面的调用

developers = await client.GetFromJsonAsync<Developer[]>("api/developer");

感谢您的所有回答,祝您编码愉快!

EDIT1:Chrome 开发者控制台屏幕

【问题讨论】:

首先检查api是否由于某种原因实际上返回了一个json而不是一个错误页面? @Umair 根据 chrome dev 控制台,我的 api 方法返回 Status Code:200 所以我在这里没有看到问题,但我真的不知道这是否是你所要求的。我对 WebApi 概念很陌生,所以我可能会迷路 您在交付 HTML 页面时获得 200。 @HenkHolterman 请检查我在问题中的编辑 现在从浏览器栏中的屏幕截图中删除该网址,看看会发生什么。你应该看到一些 json。 【参考方案1】:

当您使用托管选项创建 Blazor Webassembly 应用程序时,您会创建一个 API 服务器来启动 SPA 应用程序。

当您从 SPA 调用 API 时,路由中的任何错误不会给出 404 错误,而是返回 Blazor 页面(带有“抱歉,这里没有”),代码 200。因为所有“剩余”的 url 都被路由到客户端。

该 HTML 页面在 GetFromJsonAsync() 中触发了 Json 反序列化器。导致错误信息:

不支持提供的 ContentType;支持的类型是 'application/json' 和结构化语法后缀 'application/+json'

因此,总而言之,您的 API 方法很好。它只是永远不会被调用。在 Get() 操作中放置一个断点,它不会被命中。您必须调试路由(服务器)和url(客户端)组合。

在这种情况下,错误不在发布的代码中,这应该有效。它必须是您在 index.cshtml 、 Server.Startup.cs 或 Client.Program.cs 中所做的更改

【讨论】:

特别感谢 @HenkHolterman 和 Umair 提供的所有帮助。事实证明,确实 Api 没有工作,我仍然不知道为什么 - 我将我的项目复制到一个新项目并且它工作(我终于在“api/controller”中有一个 JSON 结果)。下一个错误是没有从 Api 调用特定方法 - 我完全按照教程一步一步进行操作,但控制器中没有 [Route] 参数,因此出现错误。

以上是关于Blazor Web Api 返回 text/html 而不是 application/json的主要内容,如果未能解决你的问题,请参考以下文章

Blazor 服务器 api 返回文本/html

Blazor 的 Web api 基本 URL 的全局变量

.NET 6 Web API 和 Blazor 服务器应用程序之间的回调侦听器

使用 azure AD B2C 进行 blazor web api 身份验证

Azure 静态 Web 应用 Blazor WASM .Net Core API 和标识 - 无法从“_configuration”加载设置

Cors Policy 问题 Blazor WASM、Web API 和 Identity Server 4 和 IIS