ASP.NET MVC网站从磁盘问题中读取文件

我在正在研究的MVC网站上正在使用C#读取包含SQL插入语句的文本文件。 调试我正在使用的函数工作正常,插入发生。 但是一旦我发布网站并在我的本地计算机上运行它(使用IIS设置甚至使用asp.net 4.0)它似乎不起作用。

if (Request.Files != null && Request.Files["txtImportFile"] != null) { //newFilePath = Server.MapPath("\\" + DateTime.Now.Ticks + Request.Files["txtImportFile"].FileName); string[] temp_string = Request.Files["txtImportFile"].FileName.Split(new char[] { '\\' }); string temp_filename = temp_string[temp_string.Count() - 1]; //newFilePath = Server.MapPath("\\temp\\" + DateTime.Now.Ticks + Request.Files["txtImportFile"].FileName); newFilePath = Server.MapPath("\\temp\\" + DateTime.Now.Ticks + temp_filename); Request.Files["txtImportFile"].SaveAs(newFilePath); StreamReader reader = new StreamReader(newFilePath); string contents = reader.ReadToEnd(); reader.Close(); Models.WingsRemoteDbLibrary dbLib = new Models.WingsRemoteDbLibrary(); string update_message = dbLib.UpdateSlaveItemsTable(contents); if (System.IO.File.Exists(newFilePath)) System.IO.File.Delete(newFilePath); RandomPopupView(update_message); } 

我希望我的解释听起来不含糊。 我会尽力回答任何进一步的问题。 谢谢。

解决方法:

而不是使用

 Server.MapPath("\\temp\\"... 

在root下创建名为“temp”的文件夹并使用

 System.Web.HttpContext.Current.Request.MapPath("~\\temp.... 

嗯,“它似乎不起作用”是非常模糊的 – 更多的细节会很好! 但这听起来像是权限问题。 IIS中的默认配置文件几乎无法访问磁盘, 尤其是写访问。 无论如何写在你自己的站点内并不是一个好主意(我自己使用磁盘的一个不相关的部分),但你需要配置IIS以在特定的命名身份中运行应用程序,并且可以访问磁盘。 不幸的是,配置帐户本身 (不是IIS – 帐户;例如授予“作为服务登录”)作为ASP.NET帐户运行并不是特别微不足道。

另一个想法:你的应用程序是一个子应用程序,即你的app-root / ,还是/MyApp/ ? 我问的原因是你对MapPath的使用可能相对于app-root更好地表达,即~/temp/ – 但我再次强调; 在应用程序内部写作是有风险的。 你真的希望该文件夹不执行。

这个问题可能有另一种解决方案。 如果您可以在构建时将文件“烘焙”到程序集中,则可以完全避免弄乱路径和文件系统。 以下是如何执行此操作的方法:

  1. 在Visual Studio解决方案资源管理器中,右键单击文件并转到“属性”。

  2. 将Build Action设置为“Embedded Resource”。

  3. 稍后您可以使用GetManifestResourceStream读取该文件:

      var stream = GetType() .Assembly .GetManifestResourceStream("YourNameSpace.Folder.YourFile.txt"); using (var reader = new StreamReader(stream)) { var fileContent = reader.ReadToEnd(); } 

    更多信息在这里 。