如何从Blazor WASM中的类调用StateHasChanged()/ NotifyAuthenticationStateChanged

时间:2020-06-11 08:11:16

标签: asp.net-core blazor

在我的项目中,我创建了一个用于处理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,但这意味着要在我通过My​​Http.PostPFAsync调用WebAPI的任何地方进行检查,而我想一获得401就将其集中化(实际上我是如果我无法使用刷新令牌,但在此示例中保持简单,将执行此操作。

0 个答案:

没有答案