2014-12-02 71 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下载问题。