我使用以下代码登录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;
}
UPDATE-1 在这种情况下,没有值实际为null,因为我可以在调试模式下看到它。但当我删除等待Task.Run(()= {});阻止此代码,它没有任何问题。
答案 0 :(得分:4)
问题是Task.Run
。在ASP.NET中,当传入的请求到达时,它会分配一个线程池线程来处理该请求,并且该线程运行您的代码。您的代码所做的是使用Task.Run
移动到另一个线程池线程而不请求上下文,然后假定它具有请求上下文。如果没有请求上下文,FormsAuthentication.SetAuthCookie
(和HttpContext.Current
)将无法正常工作。
要解决此问题,请移除对Task.Run
的呼叫。你应该(几乎)从不在ASP.NET上使用Task.Run
。