【发布时间】:2014-11-26 20:59:14
【问题描述】:
我正在使用以下代码登录 Web api。我在FormsAuthentication.SetAuthCookie(authUser.UserId.ToString(), false); 上得到空引用异常
称呼。请指导我做错了什么......
[AllowAnonymous]
[HttpPost]
public async Task<string> SignIn(JObject credentails)
{
string returnVal = "";
await Task.Run(() =>
{
string userName = (string)credentails.SelectToken("Username");
string password = (string)credentails.SelectToken("Password");
UserService userSvc = new UserService(new SqlConnection(_conStr));
var authUser = userSvc.Authenticate(userName, password);
if (authUser != null)
{
FormsAuthentication.SetAuthCookie(userName, false);
HttpContext.Current.Session.Add("DR_CLIENT_ID", authUser.DRClientId);
HttpContext.Current.Session.Add("USER_ID", authUser.UserId);
returnVal = authUser.FullName;
}
else
{
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
{
Content = new StringContent("Invalid Credentials!"),
ReasonPhrase = "Error"
});
}
});
return returnVal;
}
更新-1 在这种情况下,实际上没有值是 null,因为我可以在调试模式下看到它。但是当我删除 wait Task.Run(() = {});阻止此代码,它可以正常工作,没有任何问题。
【问题讨论】:
-
请重新考虑,因为这个问题不是关于空引用异常,而是关于主线程和后台线程...
-
好的。下次,请说明您检查了所有这些。我无法从你的问题中看出。此外,如果有一位接近的选民,请使用@username ping 他。
-
HttpContext.Current在任务中将为空,这可能是您的 NullReferenceException 的原因。见this question -
@DanielJ.G.在调试模式下它似乎不为空。
-
仅供参考,似乎没有人向房间里的大象讲话。你为什么首先使用 Task.Run 呢。即使您没有使用 SetAuthCookie,您仍然不会希望您的 Web 应用程序受 I/O 约束。延伸为 DB 的 UserService 应该以异步方式实现,并且该代码中的其他任何内容都没有任何理由在另一个线程上完成。
标签: c# asynchronous asp.net-web-api