2013-09-30 64 views
5

我有一個下載頁面,其中包含指向本地存儲在Web服務器上的文件的鏈接。當用戶打開一個文本文件時,一切都很好,但是當他們打開Office文件並從IE或Firefox中的對話框中選擇「打開」時,ASP會創建一個新的會話。下載文件時ASP.MVC會話丟失

我簡化控制器的方法是:

<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()事件。

enter image description here

如果您保存該文件,然後查看它在IE一個新的會話不會創建。如果您單擊上圖中的打開按鈕,這只是一個問題。

這是爲什麼,我該如何防止它?

核心問題是,當我的應用程序看到新會話啓動並且用戶具有有效的表單身份驗證cookie時,它會假定IIS重新啓動並刪除用戶的Cookie。所以每當用戶打開Word文檔時,他們都會從應用程序中註銷。

+0

您是否在使用會話狀態進行應用授權?如果是這樣,你有嚴重的安全漏洞...會話不應該用於安全。 –

+0

不,我正在使用表單身份驗證的自定義實現。會話狀態和「註銷」之間的鏈接是,如果我檢測到新會話並且用戶具有有效的表單身份驗證cookie,則我假定IIS重置並刪除其auth cookie以保持數據完整性。請參閱http://www.netnewsgroups.net/aspnet/t4780-forms-authentication-session-expiration.aspx – nunzabar

回答

2

當在Internet Explorer中單擊DOC鏈接時,它會將它交給Word。這意味着Word會下載,而不是IE。正因爲如此,有一個新的「瀏覽器連接」,並創建一個新的會話,因爲它實際上不是IE做下載。

+0

好吧,以便解釋「爲什麼」...現在我該如何修復它?這一定是一種常見的情況。 – nunzabar

2

我在回答我自己的問題。

我發現一個解決方案Matt's answer指出我在正確的方向。

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

現在辦公室可以下載文件,但不會觸發新會話:我只需添加一個屬性,如下所示禁用SessionState會的控制器。我的應用程序不再被破壞。