异步调用后 UserContext 变为空

UserContext becomes null after async call

我的函数 Verify 中有一个 Web 服务调用。 代码如下:

public async Task<ActionResult> Index()
{
    ....
    
    UserContext.LoginUser = null;

    if (!string.IsNullOrEmpty(etoken))
    {
        SSOLogin ssoLogin = new SSOLogin();
        LoginUser user = await ssoLogin.Verify(etoken);
        UserContext.LoginUser = user;
        if (UserContext.LoginUser == null)
            return RedirectToAction("UnAuthorized", "Login");
        else
        {
            Session["authenticated"] = true;
            userId = UserContext.LoginUser.UserId;
            domain = UserContext.LoginUser.Domain;
        }
    }
}

public async Task<LoginUser> Verify(string etoken)
{
    string publicKey = "xxx";

    LoginUser loginUser = null;

    WSVerifyAccessToken wsVerifyAccessToken = new WSVerifyAccessToken();
    string verifyResponse = await wsVerifyAccessToken.VerifyAccessToken(etoken); // Inside, this is a web service call

    if (!string.IsNullOrEmpty(verifyResponse))
    {
        /* Some processing here */
    }


    return loginUser;
}

问题是,在 Verify 函数

之后 UserContext 变为 null
LoginUser user = await ssoLogin.Verify(etoken);

因此当我分配

UserContext.LoginUser = user;

给我错误 System.NullReferenceException: Object reference not set to an instance of an object.

我试着让函数同步

LoginUser user = await ssoLogin.Verify(etoken).Result;

但是 Web 服务调用将挂在那里,永远不会完成。

有什么解决办法吗?

runtime 目标框架是 4.0 而不是 4.5 或更高版本时,这是一个已知问题 web.config 文件。这可能不同于您的项目设置的目标框架。 Make sure that the runtime target framework is 4.5 or higher.

另外: UserContext 绑定到初始化请求的线程。因此,您应该 return 对原始上下文的等待调用的回调。即使 ConfigureAwait(true) 是默认值,您也应该通过指定以下内容来确保在回调中使用正确的上下文:

UserContext.LoginUser = await ssoLogin.Verify(etoken).ConfigureAwait(true);

查看有关配置等待方法的更详细说明here