task.run异步方法中的null引用错误

时间:2014-11-26 12:02:11

标签: c# asynchronous asp.net-web-api

我使用以下代码登录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(()= {});阻止此代码,它没有任何问题。

1 个答案:

答案 0 :(得分:4)

问题是Task.Run。在ASP.NET中,当传入的请求到达时,它会分配一个线程池线程来处理该请求,并且该线程运行您的代码。您的代码所做的是使用Task.Run移动到另一个线程池线程而不请求上下文,然后假定它具有请求上下文。如果没有请求上下文,FormsAuthentication.SetAuthCookie(和HttpContext.Current)将无法正常工作。

要解决此问题,请移除对Task.Run的呼叫。你应该(几乎)从不在ASP.NET上使用Task.Run