在异步方法中处理会话

时间:2014-07-22 06:52:00

标签: c# .net session asynchronous async-await

我是MVC5的新手并尝试在控制器中使用异步方法实现会话。我已经创建了这样的方法

public async Task<ViewResult> Index()
{
    string currentUserId = User.Identity.GetUserId();
    var userId = Convert.ToInt64(HttpContext.Session["UserId"]);

    var userDetail = await service.GetBy(currentUserId),
}

此会话事件始终失败,并显示以下消息

  

应用程序中的服务器错误。无法转换类型的对象   &#39; System.Threading.Tasks.Task`1 [System.Int64]&#39;输入   &#39; System.IConvertible&#39;

(抱歉,由于此网站上没有足够的声誉点,我无法发布实际错误的屏幕截图)

我也试过这样做

var userId = await Task<long>.FromResult(Convert.ToInt64(HttpContext.Session["UserId"]));

var userId = await (Session["UserId"] as Task<long>);

var userId = await Convert.ToInt64(HttpContext.Session["UserId"]);

但是,它始终给出相同的信息。有人可以指出我正确的方法。此外,如果我们不能在异步方法中使用会话,那么最佳解决方案是什么。

1 个答案:

答案 0 :(得分:7)

该错误表示HttpContext.Session["UserId"]正在存储Task而不是实际int64。这意味着您的代码中的某个位置,您将userId存储在会话中,您可能忘记等待其结果的任务。

可能看起来像:

HttpContext.Session["UserId"] = GetUserIdAsync();

而不是:

HttpContext.Session["UserId"] = await GetUserIdAsync();

您也可以等待您尝试过的存储任务(使用错误的类型转换):

var userId = await ((Task<Int64>)HttpContext.Session["UserId"]);