【问题标题】:C# Console app : Read a file from disk both when ran as standalone and when ran from ASP.NET appC# 控制台应用程序:在独立运行和从 ASP.NET 应用程序运行时从磁盘读取文件
【发布时间】:2020-06-03 04:08:42
【问题描述】:

我想知道如何能够从两者中读取文本文件

独立运行时

从主机 ASP.NET 应用程序运行时。


我知道 Server.MapPath 命令,但它只适用于 ASP.NET 应用程序,我希望从控制台应用程序加载文件。


让我们从一个空项目开始,创建两个项目:

首先,一个控制台应用程序:

然后,一个 ASP.NET MVC 应用程序:

一旦我们有了两个项目,让我们创建一个文本文件:

然后在里面放点东西:

确保它包含在 bin 文件夹中:

现在,我们终于可以像这样读取文件内容了:

使用以下代码:

我们得到了想要的输出。

现在,如本文开头所述,我希望能够从同一个项目访问文件,但从 ASP.NET 应用程序调用。

让我们将控制台应用程序添加为 TestWebApp 的项目依赖项:

并像这样调用它的方法:

现在我得到这个错误:


我想知道在单独运行应用程序(控制台应用程序)或从主机 Web 服务(asp.net Web 服务器)运行时,我将如何继续并能够加载文件。

【问题讨论】:

  • 我认为您不必像那样执行控制台应用程序。您可以将它们分成两个项目并通过 Process.start 调用控制台应用程序。只要 IIS 应用程序池标识有权访问控制台应用程序,它就应该始终有效。

标签: c# asp.net file iis


【解决方案1】:

使用AppContext.BaseDirectory。这是运行时检查以解析程序集的目录。在您的上下文中,这是最接近输出目录的位置。

现在,控制台应用程序与 Web 应用程序返回的内容有所不同。下面的通用代码将解决这两个问题。

var appContextBase = AppContext.BaseDirectory;
var filePath = appContextBase.IndexOf("bin", StringComparison.OrdinalIgnoreCase) == -1 ? "bin/Files/File.txt" : "Files/File.txt";
var fileContent = File.ReadAllText(appContextBase + filePath);
Console.WriteLine(fileContent);

对于控制台应用程序,AppContext.BaseDirectory 返回类似这样的内容 - "C:\\Users\\user123\\Documents\\Visual Studio 2017\\Projects\\MySamples\\MySamples\\bin\\Debug\\"

对于 Web 应用,它返回类似这样的内容 - "C:\\Users\\user123\\Documents\\Visual Studio 2017\\Projects\\MySamples\\MyWebApp\\"

这就是我在filePath 上添加三元运算符检查的原因。

【讨论】:

  • 请试一试,如果它适合您,请将其标记为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多