【问题标题】:Application can find 'Downloads' folder when debugging but not on IIS应用程序在调试时可以找到“下载”文件夹,但在 IIS 上找不到
【发布时间】:2020-07-30 20:08:45
【问题描述】:

我有一个允许用户上传文件的应用程序(将其保存到位于 ASPNETCORE 应用程序的 wwwroot 的文件夹中)。从这里他们可以对其进行编辑,然后他们可以选择将文件导出为 csv/xml/xlsx,从而将文件下载到用户的“下载”文件夹。

在 Visual Studio 中调试时,一切正常,但是当我将应用程序发布并部署到 IIS 时,出现异常

保存文件 C:\windows\system32\config\systemprofile\Downloads(FILE NAME) 时出错

找不到部分路径 C:\windows\system32\config\systemprofile\Downloads(FILE NAME)

这是我获取下载文件夹的当前方式:

FileInfo file = new FileInfo(Path.Combine(Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\Downloads"), data.Filename + "." + data.FileType));

但是,我也尝试了 Hans Passant 回答类似问题here 的解决方案。这两种解决方案在本地调试时都可以正常工作,但是一旦我发布它们,这个就会产生异常:

值不能为空。参数名称:path1

当我尝试将文件保存到用户的下载文件夹时,我认为此时会抛出此错误。

using (var package = new ExcelPackage(file))
{
    var workSheet = package.Workbook.Worksheets.Add("ExportSheet");
    workSheet.Cells.LoadFromCollection(exports, true);
    package.Save();
}

我真的不知道如何重现这些异常,因为在本地使用 Visual Studio 一切正常。

有没有其他人在尝试下载文件时遇到过这个问题?

更新:当应用程序在 IIS 上运行时,它似乎将其用作用户配置文件而不是实际用户,因此当它尝试导航到“下载”文件夹时,它找不到它。如何强制它使用用户的个人资料?

LoadUserProfile 已设置为 True。

【问题讨论】:

  • 可能是权限有问题?
  • @Mateech 我不这么认为。下载文件夹几乎对所有人都具有读写权限
  • 先了解差异blog.lextudio.com/…
  • 您需要堆栈跟踪来找到异常的确切行。您还可以通过确认每个变量的输出并将其写入日志文件来进行一些详细的调试。

标签: c# asp.net-core iis asp.net-core-mvc


【解决方案1】:

Web 应用程序不了解最终用户计算机的文件系统!

因此在服务器端代码中使用Environment.GetFolderPathEnvironment.ExpandEnvironmentVariables只会显示服务器端用户(即Windows服务标识)的配置文件目录,其中完全独立于您的网络应用程序的实际基于浏览器的用户操作系统用户配置文件。

作为一个简单的思想实验:考虑一个用户在一个更加陌生的操作系统上运行一个奇怪的外星网络浏览器(比如,iBrowse for the Amiga!)——Windows-shell“下载”目录的概念只是没有'不存在,但他们在这里,正在浏览您的网站。您期望在这种情况下您的代码会做什么?

要将文件“下载”给用户,您的服务器端 Web 应用程序应使用the Content-Disposition: header 提供生成文件的原始字节(例如使用HttpResponse.TransmitFile)以提供提示 向用户的浏览器告知他们应该保存文件而不是尝试在浏览器中打开它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多