5

我有一个下载页面,其中包含指向本地存储在 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 文档时,他们都会退出应用程序。

4

2 回答 2

2

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

于 2013-09-30T21:31:46.737 回答
2

我在回答我自己的问题。

在马特的回答指出我正确的方向后,我找到了解决方案。我只是通过添加如下属性为控制器禁用了 SessionState:

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

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

于 2013-10-01T13:08:39.567 回答