1
public ActionResult Index()
{
    TempData["msg"] = "Test";
    return RedirectToAction("About");
}

public ActionResult About()
{
    var msg = TempData["msg"];
    return View();
}

一个简单的问题。我相信当我看到它的答案时,我会拍自己的额头。

在浏览器中导航到 Index 操作会导致重定向到 About 操作,并且 TempData 值是正确的。

为什么当我使用 Fiddler 作曲家导航到 Index 操作时,它会导致重定向到 About 操作但 TempData 值丢失并且为空?

4

2 回答 2

1

我认为可以在这里找到答案(http://msdn.microsoft.com/en-us/library/ms178581(v=vs.100).aspx):

“会话由可以使用 SessionID 属性读取的唯一标识符标识。当为 ASP.NET 应用程序启用会话状态时,会检查应用程序中对页面的每个请求是否有从浏览器发送的 SessionID 值。如果没有提供 SessionID 值,ASP.NET 启动一个新会话,并且该会话的 SessionID 值与响应一起发送到浏览器。”

当我将此行添加到每个动作的开头时:

Debug.Write(string.Format("SessionId: {0}\r\n", HttpContext.Session.SessionID));

我看到当您从浏览器运行时,sessionid 是相同的。当从 Fiddler 作曲家运行时,它们是不同的。

因此,将使用默认的 TempDataProvider(将 TempData 存储在会话状态)重置 TempData。

于 2012-09-27T03:02:03.877 回答
0

如果请求相同,则结果应该相同。很可能您在编写假请求时没有制作第一个请求的精确副本。请注意,在 tempData 的情况下,只有当它是包含此数据的第一个请求时,您的组合请求才会起作用(获取 tempData)-因此您必须“复制”尚未由应用程序发送的请求,您无法重播请求依赖于 tempData。

临时数据存储在会话状态中并在第一次请求后被清除,因此如果您没有正确地手动/通过 Fiddler 作曲家发送信息或(如您的情况)使用相同的信息到同一个控制器。

另请参阅有关同一主题的其他相关问题。

于 2012-09-26T20:24:47.140 回答