当 ActionResult 中的 return File() 时,IE 不设置 cookie
IE doesn't set cookie when return File() from ActionResult
所以我遇到了一个问题,即在返回一个文件后,cookie 没有设置,只发生在 IE 中。
逻辑如下:
- 当用户第一次访问页面时,他们会返回一个视图
- 用户提交表单并生成文档
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)
});
所以我遇到了一个问题,即在返回一个文件后,cookie 没有设置,只发生在 IE 中。
逻辑如下:
- 当用户第一次访问页面时,他们会返回一个视图
- 用户提交表单并生成文档
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)
});