Blazor WASM Http 调用未命中某些 API 端点。而是接收index.html

Dav*_*ave 3 dotnet-httpclient asp.net-core blazor blazor-webassembly

我有一个 Blazor WASM 页面,需要进行调用以从 API 获取一些数据。Blazor 应用程序由 ASPNetCore 托管,并且托管应用程序包含 API。

我的一些端点可以工作,但一些调用会引发 Json 序列化异常。

渲染组件未处理的异常:“<”是值的无效开头。路径: $ | 行号: 0 | 内联字节位置:0。

如果我查看服务器的实际响应,它看起来像是从我的 WASM 应用程序返回 index.html 的内容。

控制器示例

[Authorize]
[ApiController]
[Route("api/[controller]")]
public class CompanyController : ControllerBase
{
    private readonly ApplicationDbContext _context;

    public CompanyController(ApplicationDbContext context)
    {
         _context = context;
    }

    [HttpGet("{id}")]
    public async Task<IActionResult> Get(long id)
    {
        Company? company = await _context.Companies.FindAsync(id);
        if (company == null)
        {
            return NotFound();
        }

        return Ok(company);
    }
}
Run Code Online (Sandbox Code Playgroud)

Blazor 页面示例


@page "/companies/{id:long}"
@attribute [Authorize]
@inject HttpClient Http
@inject NavigationManager Nav


@if (company != null)
{
    <div>@company.Name</div>
}
else
{
    <div>Loading Company...</div>
}

@code {

    private Company? company;

    [Parameter]
    public long Id { get; set; }

    protected override async Task OnInitializedAsync()
    {
        try
        {
            company = await Http.GetFromJsonAsync<Company>($"/api/company/{Id}");
        }
        catch (AccessTokenNotAvailableException exception)
        {
            exception.Redirect();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,一切都按预期进行。但如果我进行以下两个更改,我将收到上面提到的 Json 异常。

  1. 创建一个名为 的相同控制器WorkOrderController。其他一切都相同,包括从数据库中提取公司数据。只是控制器的名称不同。
  2. 将 Http 请求更改为company = await Http.GetFromJsonAsync<Company>($"/api/workOrder/{Id}");Blazor 页面中的。

为什么有些端点可以工作,有些则不行?

Dav*_*ave 6

因此,传递给 GetFromJsonAsync 的 requestUri 必须是小写。我的请求失败了,因为我的“workOrder”中有一个大写的“O”。

我不确定为什么这是请求参数的要求,但遗憾的是,将路径设置为小写可以解决问题。