Asp.net 下载文件时ASP.MVC会话丢失

Asp.net 下载文件时ASP.MVC会话丢失,asp.net,asp.net-mvc,Asp.net,Asp.net Mvc,我有一个下载页面,其中包含指向存储在web服务器上的本地文件的链接。当用户打开一个文本文件时一切正常,但当他们打开一个Office文件并从IE或Firefox中的结果对话框中选择“打开”时,ASP会创建一个新会话 我的简化控制器方法是: 作为ActionResult下载公共函数(文件名为字符串) '文件名示例:C:\ProgramData\MyCompany\MyApp\SomeFile.txt 返回新的FilePathResult(文件名,“应用程序/八位字节流”) 端函数 调试显示,只要

我有一个下载页面,其中包含指向存储在web服务器上的本地文件的链接。当用户打开一个文本文件时一切正常,但当他们打开一个Office文件并从IE或Firefox中的结果对话框中选择“打开”时,ASP会创建一个新会话

我的简化控制器方法是:


作为ActionResult下载公共函数(文件名为字符串)
'文件名示例:C:\ProgramData\MyCompany\MyApp\SomeFile.txt
返回新的FilePathResult(文件名,“应用程序/八位字节流”)
端函数
调试显示,只要在浏览器中单击“打开”,就会触发Global.asax Session_Start()事件

如果保存文件,然后在IE中查看,则不会创建新会话。仅当您单击上图中的“打开”按钮时才会出现问题

这是为什么?我如何预防


核心问题是,当我的应用程序看到新会话启动且用户拥有有效的Forms身份验证cookie时,它会假定IIS已重新启动并删除用户的cookie。因此,每次用户打开Word文档时,他们都会从应用程序中注销

在Internet Explorer中单击文档链接时,它会将其交给Word。这意味着Word进行下载,而不是IE。因此,建立了一个新的“浏览器连接”,并将创建一个新会话,因为它实际上不是IE进行下载。

我在回答我自己的问题

在给我指明了正确的方向后,我找到了解决办法。我只是通过添加如下属性来禁用控制器的SessionState:

<SessionState(SessionStateBehavior.Disabled)>
Public Class AttachmentController
    ...
End Class

公共类AttachmentController
...
末级

现在Office可以下载文件,但不会触发新会话。我的应用程序不再坏了。

好的,这就解释了“为什么”。。。现在我该怎么修呢?这必须是常见的情况。您是否使用会话状态进行应用程序授权?如果是这样,你有严重的安全漏洞。。。会话不应用于安全性。不,我使用的是表单身份验证的自定义实现。会话状态和“注销”之间的联系是,如果我检测到一个新会话,并且用户具有有效的forms auth cookie,我假设IIS重置并删除其auth cookie以保持数据完整性。看见