2014-12-02 21 views
1

的Windows Server 2012 R2IIS 8.5文件找不到路徑 - URL編碼

IIS 8.5

的.NET Framework 4.5.1與Windows 8.1或Windows Server 2012 R2

ASP .NET應用程序安裝用Visual Studio 2012中的C#編寫

這是一個最近纔開始發生的問題,該應用程序在較早的操作系統上運行(我相信IIS 7.5 Windows 2008R2,但不是100%確定)。

本質上,當應用程序在本地系統上建立一個文件的路徑時,它將URL編碼爲路徑。然後,當應用程序試圖找到所述文件時,它返回File Not Found。

該代碼本身是一個有點愚蠢。我沒有寫,我打算在時間允許的情況下重新寫。下面是試圖抓住文件,並在屏幕上顯示它的方法:

private void OpenClaimFile(String PackageId, String ClaimId, String DocType, String AttachmentID) 
{ 
    string filename = string.Empty; 

    string folderPath = Helper.PackagePath + PackageId + @"\" + ClaimId + @"\"; 
    string path = string.Empty; 


    if (string.IsNullOrEmpty(DocType) || DocType == " ") 
    { 
     filename = AttachmentID; 
    } 
    else 
    { 
     filename = DocType + "_" + AttachmentID; 
    } 

    path = folderPath + filename + ".pdf"; 

    if (File.Exists(path)) 
    { 
     Response.Clear(); 
     Response.AddHeader("content-disposition", "attachment;filename=" + filename); 
     Response.ContentType = "application/pdf"; 
     Response.WriteFile(Helper.PackagePath + PackageId + "/" + ClaimId + "/" + filename + ".pdf");  
    } 
    else 
    { 
     Alert("File Not Found!"); 
    } 
} 

Helper.PackagePath從web.config中抓起,並像"D:\RootPath\"

我測試不包含空格的文件,以及文件由瀏覽器下載到Downloads文件夾。這是一個次要問題,因爲它應該在瀏覽器中顯示爲PDF。

使用Sysinternals的ProcessMon,我發現,在路徑字符串中的實際文件名是一樣的東西D:\RootPath\PackageID\ClaimID\My%20Mos%20Excellent%20File.pdf而不是D:\RootPath\PackageID\ClaimID\My Most Excellent File.pdf.

的問題似乎是,該應用程序現在URL編碼的路徑,它建立並試圖找到該文件並失敗。我已經在網上搜索了關於這方面的任何信息,而我的結果幾乎沒有。 I did find this one article

今晚如果我有機會,我會嘗試嘗試在web.config中找到的文章中引用的更改,看看它是否可以解決問題。作爲參考,這種變化是:

<configuration> 
    <appSettings> 
     <add key="aspnet:UseLegacyRequestUrlGeneration" value="true" /> 
    </appSettings> 

但是,我會很感激任何人都有這個問題的任何見解。

另外,如果任何人有任何洞察我的第二個問題,我會很感激。我只是開始看它,但瀏覽器應該現場打開文件,而不是下載它。這種行爲也是最近的。我意識到這是系統中的一項新安全設置,禁止打開PDF文件,因爲它們可能很危險。不過,我還沒有完全研究過這個問題。

+0

我看不到ClaimId在哪設置,但是你不能總是這樣嗎ClaimId = System.Web.HttpUtility.UrlDecode(ClaimId)?如果ClaimId未經過網址編碼,則不會發生任何錯誤。嘗試Content-Disposition:內聯;文件名=「filename.pdf」爲您的第二個問題。 – mhanney 2014-12-02 20:27:34

+0

索賠ID只是一個正在傳遞的字符串。我們從網頁抓取這些信息,作爲用戶點擊查看文件的GridView的一部分。這只是一個字符串。重要的部分是AttachmentID,它是URL編碼的實際文件名。我可能必須做你的建議。我試圖*不*由於其他約束而進行任何代碼更改。但是,看起來我可能沒有這種奢侈。感謝您的意見。 – Dan7el 2014-12-02 20:44:41

+0

噢,我看到AttachmentID當然是文件名了。我認爲你是正確的,將是修復。 – mhanney 2014-12-02 21:25:20

回答

1

使用<add key="aspnet:UseLegacyRequestUrlGeneration" value="true" />確實不是解決此問題。

我最終不得不重新編寫路徑上使用HttpUtility.UrlDecode(...)的方法。當我這樣做,並將「內聯」添加到Content-Disposition,並解決了PDF視圖vs下載問題。