我正在处理一个Blazor WASM项目,我有一个页面需要将文件发布到服务器。所以我写了这样的东西:
@page "/Test"
@inject HttpClient httpClient
<h4>Please upload a file.</h4>
<form>
<InputFile OnChange="OnInputFileChange"/>
</form>
@code {
private async Task OnInputFileChange(InputFileChangeEventArgs e)
{
// Returns 1 just fine
var dummyTest = await httpClient.GetFromJsonAsync<int>("api/Test/Action");
// Gets a 404 error
var response = await httpClient.PostAsJsonAsync("api/Test/Action", e.File);
var content = await response.Content.ReadFromJsonAsync<int>();
}
}
我有这个控制器
[ApiController]
[Route("api/[controller]/[action]")]
public class TestController : ControllerBase
{
[HttpGet]
public async Task<ActionResult<int>> Action()
{
return 1;
}
[HttpPost]
public async Task<ActionResult<int>> Action(IFormFile file)
{
return 1;
}
}
我的问题是GET请求执行得很好,dummyTest
设置为1,但response
得到404,尝试调用ReadFromJsonAsync
得到System.Text.Json.JsonException: The input does not contain any JSON tokens.
。
我不确定我在这里错过了什么。
提前感谢!
到目前为止,我在Blazor中发现,服务器和客户端之间需要一个JWT或替代方案来进行通信。
在Blazor.Client项目中,您可以选择从程序中删除以下内容。cs
请注意,下面的删除是不安全的,我不确定删除它的后果。否则,你必须实现某种身份验证提供程序,我使用auth0来解决这个问题。
builder.Services.AddHttpClient("BlazorExample.ServerAPI", client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress));
//remove this: .AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();