代码之家  ›  专栏  ›  技术社区  ›  MightyAtom

TempData和Fiddler

  •  1
  • MightyAtom  · 技术社区  · 13 年前
    public ActionResult Index()
    {
        TempData["msg"] = "Test";
        return RedirectToAction("About");
    }
    
    public ActionResult About()
    {
        var msg = TempData["msg"];
        return View();
    }
    

    一个简单的问题。当我看到答案的时候,我肯定会拍案叫绝的。

    在浏览器中导航到“索引”操作会导致重定向到“关于”操作,并且TempData值是正确的。

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

    2 回复  |  直到 13 年前
        1
  •  1
  •   Mike Cheel    13 年前

    我想答案就在这里(http://msdn.microsoft.com/en-us/library/ms178581(v=vs.100).aspx):

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

    当我在每个动作的开头加上这一行时:

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

    我看到当你从浏览器运行时,sessionid是一样的。当从小提琴家那里演奏时,它们是不同的。

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

        2
  •  0
  •   Community Mohan Dere    9 年前

    如果请求相同,则结果应该相同。最有可能的是,在撰写虚假请求时,您并没有完全复制第一个请求。请注意,在tempData的情况下,只有当它是第一个包含此数据的请求时,您的合成请求才能工作(获取tempData),因此您必须对尚未由应用程序发送的请求进行“复制”,您不能重放依赖于tempData的请求。

    临时数据存储在会话状态下,并在第一次请求后擦除,因此,如果您没有正确地手动/通过Fiddler composer向其发送信息,或者(在您的情况下)向同一控制器发出具有相同信息的第二次请求,则临时数据将无效/丢失。

    另请参阅其他 related questions 关于同一主题。