我有一个下载页面,其中包含指向本地存储在Web服务器上的文件的链接。当用户打开文本文件时,一切都很好,但是当他们打开Office文件并从IE或Firefox中生成的对话框中选择“打开”时,ASP会创建一个新会话。
我的简化控制器方法是:
<HttpGet()>
<AppAuthorize(Domain.Security.TransactionId.Download)>
Public Function Download(fileName As String) As ActionResult
' fileName example: C:\ProgramData\MyCompany\MyApp\SomeFile.txt
Return New FilePathResult(fileName, "application/octet-stream")
End Function
调试显示,只要在浏览器中单击“打开”,就会触发Global.asax Session_Start()事件。
如果保存文件,然后在IE中查看,则不会创建新会话。如果您单击上面的图片中的“打开”按钮,这只是一个问题。
为什么会这样,我该如何预防呢?
核心问题是,当我的应用程序看到新会话已启动并且用户具有有效的表单身份验证cookie时,它会假定IIS已重新启动并删除用户的cookie。因此,每次用户打开Word文档时,他们都会从应用程序中注销。
答案 0 :(得分:2)
在Internet Explorer中单击DOC链接时,会将其移交给Word。这意味着Word会进行下载,而不是IE。因此,有一个新的“浏览器连接”,并且将创建一个新的会话,因为它实际上不是IE正在进行下载。
答案 1 :(得分:2)
我正在回答我自己的问题。
我在Matt's answer指出正确的方向后找到了一个解决方案。我只是通过添加如下属性来禁用控制器的SessionState:
<SessionState(SessionStateBehavior.Disabled)>
Public Class AttachmentController
...
End Class
现在Office可以下载文件但不会触发新会话。我的应用程序不再破坏。