当 ActionResult 中的 return File() 时,IE 不设置 cookie

IE doesn't set cookie when return File() from ActionResult

所以我遇到了一个问题,即在返回一个文件后,cookie 没有设置,只发生在 IE 中。

逻辑如下:

  1. 当用户第一次访问页面时,他们会返回一个视图
  2. 用户提交表单并生成文档
    2.a。如果文件生成成功:它returns一个供用户下载的文件。
    2.b。如果文件生成失败:它 returns 一条错误消息。

2 的两种情况下:页面应该显示一条消息,因为设置了 cookie - 但是它只在文件失败时显示一条消息,而不是 returns 一个文件供下载。

我的代码看起来像这样:

public ActionResult MyAction(string parm) {
    if (parm != null) {
        // generate file and message
        byte[] generatedFile = GenerateCsvFile(parm, out bool success, out string message);

        // Set cookie with message saying it failed or succeeded
        Response.Cookies.Add(new HttpCookie("downloadedFile", message) {
            Expires = DateTime.Now.AddSeconds(60)
        });

        if (success) { // return file for user to download
            return File(generatedFile, "text/csv", "MyDocument.csv");
        }
        return new HttpStatusCodeResult(204); // do nothing because it failed
    }

    // Initial view load
    return View();
}

这是怎么回事,我该如何解决?

返回文件时的结果消息包含无效的字符,无法放入 IE 可读的 cookie(但 Chrome、Firefox 等可读)。
因此,解决方法是在将其设置为 cookie 之前对其进行 URL 编码。

Response.Cookies.Add(
    new HttpCookie("downloadedFile", System.Web.HttpUtility.UrlEncode(message)) {
        Expires = DateTime.Now.AddSeconds(60)
    });