在我的项目中,我创建了一个用于处理HTTP POST的类。该类中的主要方法首先检查本地存储中是否有JWT令牌,检查exp日期,确定是否需要新的Toekn,如果需要,则使用刷新令牌,最后执行POST。
我用builder.Services.AddTransient<IMyHttp, MyHttp>();
现在,如果刷新令牌无效,我想通知UI(StateHasChanged()
或NotifyAuthenticationStateChanged
),以便立即注销用户。
关键是我不知道如何从我的http类中引发事件(而从控制器中只是调用this.StateHasChanged()即可。)
根据此处的建议,您是(伪)代码:
索引控制器调用WebAPI来检查天气:
(HttpResponseMessage, IEnumerable<WeatherForecast>) result = await MyHttp.PostPFAsync<IEnumerable<WeatherForecast>>("WeatherForecast/GetWeather", null);
这是MyHttp.PostPFAsync
在Program.cs中注入了builder.Services.AddTransient<IMyHttp, MyHttp>();
public async Task<(HttpResponseMessage, T)> PostPFAsync<T>(string requestUri, object data)
{
// I get my JWT Token from localstorage, set up auth headers, create StreamContent content serializing data and then
HttpResponseMessage response = await _http.PostAsync(requestUri, content);
if (response.IsSuccessStatusCode)
{
return (response, "Happiness");
}
else if (response.StatusCode == System.Net.HttpStatusCode.Unauthorized)
{
// Here I clear tokens from localstorage and I'd also like to logout user and update UI
}
else return (response, default(T));
}
我显然可以注销并更新Index控制器中的UI,但这意味着要在我通过MyHttp.PostPFAsync调用WebAPI的任何地方进行检查,而我想一获得401就将其集中化(实际上我是如果我无法使用刷新令牌,但在此示例中保持简单,将执行此操作。