的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文件,因爲它們可能很危險。不過,我還沒有完全研究過這個問題。
我看不到ClaimId在哪設置,但是你不能總是這樣嗎ClaimId = System.Web.HttpUtility.UrlDecode(ClaimId)?如果ClaimId未經過網址編碼,則不會發生任何錯誤。嘗試Content-Disposition:內聯;文件名=「filename.pdf」爲您的第二個問題。 – mhanney 2014-12-02 20:27:34
索賠ID只是一個正在傳遞的字符串。我們從網頁抓取這些信息,作爲用戶點擊查看文件的GridView的一部分。這只是一個字符串。重要的部分是AttachmentID,它是URL編碼的實際文件名。我可能必須做你的建議。我試圖*不*由於其他約束而進行任何代碼更改。但是,看起來我可能沒有這種奢侈。感謝您的意見。 – Dan7el 2014-12-02 20:44:41
噢,我看到AttachmentID當然是文件名了。我認爲你是正確的, 將是修復。 –
mhanney
2014-12-02 21:25:20