【问题标题】:null reference error in task.run async methodtask.run 异步方法中的空引用错误
【发布时间】: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


【解决方案1】:

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

要解决此问题,请删除对 Task.Run 的调用。您应该(几乎)永远不要在 ASP.NET 上使用 Task.Run

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 2016-12-28
    • 2017-03-12
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多