异步调用后 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
我的函数 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
函数
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