从 blazor 页面传递 UserId
Passing UserId from blazor page
我是 blazor 的新手,所以请对我温柔点:)。在我的应用程序中有一个向服务器发送 POST 请求的按钮。被调用的端点做了很多事情,但我需要获取当前登录用户的 ID。所以我将它与请求一起传递。每次请求通过时,结果都是 System.Threading.Tasks.Task`1[System.String]。我不知道我做错了什么我知道它必须对我的异步方法做一些事情,但是经过几个小时的尝试和错误我很无助。
有人知道我为什么得到错误的值吗?有没有更好的方法来传递用户的 Id?我觉得我的方案不太理想。
非常感谢!
我的 .razor 是:
@page "/Overview"
<AuthorizeView>
<Authorized>
<div class="btn btn-warning btn-sm" style="border-color:black" @onclick="SyncTrades">Sync trades</div>
</Authorized>
<NotAuthorized>
You are not signed in. Please sign in.
</NotAuthorized>
</AuthorizeView>
@using BlazorPro.Spinkit
@using System.Net.Http.Json
@inject HttpClient Http
@using System.Security.Claims
@using Microsoft.AspNetCore.Components.Authorization
@inject AuthenticationStateProvider AuthenticationStateProvider
@code {
protected async Task SyncTrades()
{
var userId = GetUserId().ToString();
await Http.PostAsync("https://localhost:44366/api/SyncTrades/" + userId, new StringContent(""));
}
private string _authMessage;
private string _surnameMessage;
private IEnumerable<Claim> _claims = Enumerable.Empty<Claim>();
private async Task<string> GetUserId()
{
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
return user.Claims.FirstOrDefault().Value;
}
}
我的控制器post方法
// POST api/<SyncTradesController>
[HttpPost("{UserId}")]
//public void Post([FromRoute]string UserId)
public async Task Post([FromRoute] string UserId)
{
DoStuff();
}
您应该 await
GetUserId()
调用,因为它是一个异步方法:
protected async Task SyncTrades()
{
var userId = await GetUserId(); //.ToString() is redundant here
await Http.PostAsync("https://localhost:44366/api/SyncTrades/" + userId, new StringContent(""));
}
为清楚起见,建议使用 Async
-> GetUserIdAsync()
.
后缀 Task
(或 Task<T>
)返回方法
一个(更好的)替代方案是通过 headers.There 传递 UserId 是多种替代方案,但那是另一个世界!
关于认证;你可以从这里开始阅读:https://docs.microsoft.com/en-us/aspnet/core/blazor/security/?view=aspnetcore-5.0#blazor-server-authentication
我是 blazor 的新手,所以请对我温柔点:)。在我的应用程序中有一个向服务器发送 POST 请求的按钮。被调用的端点做了很多事情,但我需要获取当前登录用户的 ID。所以我将它与请求一起传递。每次请求通过时,结果都是 System.Threading.Tasks.Task`1[System.String]。我不知道我做错了什么我知道它必须对我的异步方法做一些事情,但是经过几个小时的尝试和错误我很无助。
有人知道我为什么得到错误的值吗?有没有更好的方法来传递用户的 Id?我觉得我的方案不太理想。
非常感谢!
我的 .razor 是:
@page "/Overview"
<AuthorizeView>
<Authorized>
<div class="btn btn-warning btn-sm" style="border-color:black" @onclick="SyncTrades">Sync trades</div>
</Authorized>
<NotAuthorized>
You are not signed in. Please sign in.
</NotAuthorized>
</AuthorizeView>
@using BlazorPro.Spinkit
@using System.Net.Http.Json
@inject HttpClient Http
@using System.Security.Claims
@using Microsoft.AspNetCore.Components.Authorization
@inject AuthenticationStateProvider AuthenticationStateProvider
@code {
protected async Task SyncTrades()
{
var userId = GetUserId().ToString();
await Http.PostAsync("https://localhost:44366/api/SyncTrades/" + userId, new StringContent(""));
}
private string _authMessage;
private string _surnameMessage;
private IEnumerable<Claim> _claims = Enumerable.Empty<Claim>();
private async Task<string> GetUserId()
{
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
return user.Claims.FirstOrDefault().Value;
}
}
我的控制器post方法
// POST api/<SyncTradesController>
[HttpPost("{UserId}")]
//public void Post([FromRoute]string UserId)
public async Task Post([FromRoute] string UserId)
{
DoStuff();
}
您应该 await
GetUserId()
调用,因为它是一个异步方法:
protected async Task SyncTrades()
{
var userId = await GetUserId(); //.ToString() is redundant here
await Http.PostAsync("https://localhost:44366/api/SyncTrades/" + userId, new StringContent(""));
}
为清楚起见,建议使用 Async
-> GetUserIdAsync()
.
Task
(或 Task<T>
)返回方法
一个(更好的)替代方案是通过 headers.There 传递 UserId 是多种替代方案,但那是另一个世界!
关于认证;你可以从这里开始阅读:https://docs.microsoft.com/en-us/aspnet/core/blazor/security/?view=aspnetcore-5.0#blazor-server-authentication