【问题标题】:Geting two different values for same location using GetCurrentDirectory function使用 GetCurrentDirectory 函数获取同一位置的两个不同值
【发布时间】:2019-06-06 10:01:06
【问题描述】:

我已经下载了一个 ASP.Net Core 2.2 MVC 项目。它运行良好。但是当我在我的系统中创建新的 Asp.Net core 2.2 MVC 项目并从下载的项目中复制所有代码时,一个 GetCurrentDirectory 函数无法正常工作。

我正在使用以下代码:

Path.Combine(Directory.GetCurrentDirectory(), location, fileName)

我的项目在 D 盘。 我下载的项目显示正确的路径。但我创建的项目显示在路径下方:

C:\Program Files\IIS Express\data\people.json

谁能帮我解释一下为什么会这样?

【问题讨论】:

  • GetCurrentDirectory 方法返回从操作系统的角度来看的当前目录,而不是启动可执行文件的目录。
  • 该代码很容易导致安全漏洞。如果location 来自用户输入,则类似..\..\..\Windows 的值将映射到C:\Windows。检查What is the equivalent of Server.MapPath in ASP.NET Core?
  • 为什么您首先要创建绝对路径?为什么不在配置阶段从 Content Root 中指定的路径加载它?

标签: c# asp.net-core-2.2


【解决方案1】:

在 ASP.NET Core 2.2.0 中使用 IIS 进程内托管时,当前目录设置为 IIS 应用程序本身的目录,因此在调试时它是 IIS Express 的位置:C:\Program Files\IIS Express

此行为将在 ASP.NET Core 2.2.2 中修复,使其更加直观并匹配应用程序在磁盘上的位置:https://github.com/aspnet/AspNetCore/pull/6150

【讨论】:

  • 但是我已经下载了一个项目,如果我正在运行该项目,它会显示我项目的正确位置。
  • 这两件事的调试/托管设置可能不同。如果没有项目本身,我真的无法判断。
  • 查看.csproj 文件 - 您的新文件将包含<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>,而下载的则不会。如果您需要解决方法(除了关闭 InProcess),我回答了类似的 here
  • InProcess 也是默认值,因此如果根本没有设置任何值,则会使用它。或者,可能会在 Web.config 中的 <aspNetCore> 元素上覆盖该值。
  • 这不是真的 - OutOfProcess is the default.
猜你喜欢
  • 2020-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多