Windows Server 2012 R2
IIS 8.5
与Windows 8.1或Windows Server 2012 R2一起安装的.NET Framework 4.5.1
在Visual Studio 2012中用C#编写的ASP .NET应用程序
这个问题最近才开始在旧操作系统上运行的应用程序中发生(我相信IIS 7.5 Windows 2008R2但不是100%肯定)。
实质上,当应用程序构建本地系统上文件的路径时,它会对路径进行编码。然后,当应用程序尝试查找所述文件时,它将返回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!");
}
}
从web.config中抓取 Helper.PackagePath
,类似于"D:\RootPath\"
我测试了一个没有空格的文件,浏览器将文件下载到Downloads文件夹。这是次要问题,因为它应该在浏览器中显示为PDF。
使用SysInternals ProcessMon,我发现Path字符串中的实际文件名是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 :(得分:1)
使用<add key="aspnet:UseLegacyRequestUrlGeneration" value="true" />
不解决此问题。
我最终不得不重新编写方法以在路径上使用HttpUtility.UrlDecode(...)
。当我这样做并且还将“内联”添加到Content-Disposition
并解决了PDF视图与下载问题。