找不到IIS 8.5文件路径 - URL编码

时间:2014-12-02 20:07:04

标签: c# asp.net iis

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,因为它们可能很危险。但是,我还没有完全研究过这个问题。

1 个答案:

答案 0 :(得分:1)

使用<add key="aspnet:UseLegacyRequestUrlGeneration" value="true" /> 解决此问题。

我最终不得不重新编写方法以在路径上使用HttpUtility.UrlDecode(...)。当我这样做并且还将“内联”添加到Content-Disposition并解决了PDF视图与下载问题。