【问题标题】:ASP.NET MVC Website Read File from Disk ProblemASP.NET MVC 网站从磁盘读取文件问题
【发布时间】:2011-04-18 06:00:17
【问题描述】:

我正在阅读一个文本文件,其中包含我正在处理的 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);
        }

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

【问题讨论】:

  • 如果当前的答案没有帮助,我强烈建议您添加有关实际错误的更多详细信息...

标签: c# asp.net-mvc


【解决方案1】:

解决方法:

而不是使用

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

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

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

【讨论】:

  • 我正在我的登台网站上对此进行测试,它可以工作。现在我只需要知道 Server.MapPath & HttpContext.Current.Request.MapPath 有什么区别
【解决方案2】:

嗯,“它似乎不起作用”是相当模糊的 - 更详细一点会更好!但这听起来像是权限问题。 IIS 中的默认配置文件对磁盘几乎没有访问权限,尤其是写访问权限。在您自己的站点中写入并不是一个好主意无论如何(我自己会使用磁盘的一个不相关部分),但是您需要配置 IIS 以在特定的命名身份,可以访问磁盘。不幸的是,配置帐户本身(不是 IIS - 帐户;例如授予“作为服务登录”)以作为 ASP.NET 帐户运行并不是特别简单。

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

【讨论】:

  • 对不起,我的解释很模糊。我确实认为访问是一个因素。我的代码在读取之前创建了一个临时目录来将文件存储在服务器上。
  • 允许帐户“作为服务登录”并非易事,但无论如何也不难:social.technet.microsoft.com/Forums/en-US/winserverGP/thread/…
  • @Erick - 它创建成功了吗?添加另一个想法,顺便说一句
  • @Nate - 是的,你需要的另外 6 件事,记住它们,会让人痛苦;p
  • 基于代码,它确实有效(当我在调试期间进入代码并检查目录是否存在时,它甚至可以工作)。但文件创建后会被删除,以避免服务器上出现不需要的文件。
【解决方案3】:

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

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

  2. 将构建操作设置为“嵌入式资源”。

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

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

    更多信息here。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 2017-03-05
    • 2010-12-31
    • 2023-03-13
    • 2020-03-31
    • 2014-03-11
    • 1970-01-01
    相关资源
    最近更新 更多