【问题标题】:How do I read a text file on the same server with ASP.NET?如何使用 ASP.NET 在同一台服务器上读取文本文件?
【发布时间】:2025-11-28 00:55:02
【问题描述】:

解决方案:

事实证明我没有检查它正在查找的路径,我很傻。一旦我找到了这个问题并纠正了错误的路径,阅读效果就很好了。仍然对 MSSQL 问题感到困惑,因为文章平均不到 10 000 字节。


澄清:

我不确定你们中的某些人是否认为我正在尝试读取的文件位于我的本地计算机上。它位于 Web 上,与正在访问它的脚本位于同一台服务器上。只是在不同的目录中。


我编写了一个包含文章的在线帮助台应用程序。我遇到的一个问题 是有些文章太长,当我将它们放入我的 MSSQL 数据库时被截断。我尝试使用TEXTVARCHAR(MAX) 作为数据类型,但它仍然会被截断。

所以我决定将太长的文章放入一个文本文件中,并让我的应用程序从那里读取该文本文件。我让这段代码在我的开发环境中工作,但它不能在现场工作:

Dim output As String = String.Empty
Try
    Dim theArticle As gsClassroom = classArticles(iterate)
    If theArticle.Body.StartsWith("/docs/") Then
        Dim oReader As IO.StreamReader = Nothing
        Try
            oReader = New IO.StreamReader(Server.MapPath(String.Format("/dev{0}", theArticle.Body)))


        Catch ex As Exception
            output = String.Format("{0}<br /><br />{1}", ex.Message, "internal")
        Finally
            oReader.Close()
            oReader.Dispose()
            oReader = Nothing
        End Try
    Else
        output = theArticle.Body
    End If
Catch ex As Exception
    output = String.Format("{0}<br /><br />{1}", ex.Message, "external")
End Try
Response.Output.WriteLine(output)

一开始我以为是因为我没有把/dev路径前缀改成/hlpdsk。但即使在我改变它之后,它也被炸毁了。我做错了什么?

【问题讨论】:

  • “……它被炸毁了。”我想这意味着你收到了一条错误消息。愿意告诉我们它说了什么吗?
  • "对象引用未设置为对象的实例"

标签: asp.net sql-server vb.net file-io


【解决方案1】:

在这类问题上,我首先想到的是生产环境的权限设置不允许您访问该目录。

【讨论】:

    【解决方案2】:

    我知道您想解决读取此文本文件的问题,但我建议您返回使用 Varchar(MAX) 从 sql server 表中读取文本。

    请注意,当文本大于几 KB 时,它会将其拆分为多个结果。因此,在阅读时,您必须从 datareader 读取并写入字符串生成器。完成后,您将在字符串生成器中获得全部内容。

    至于文件读取不要这样做。在服务器环境中会出现很多文件权限问题。

    【讨论】:

    • 您必须调用 reader.NextResult() 方法来获取由数据读取器拆分的字符串的下一部分
    【解决方案3】:

    什么样的帮助台文章长度超过 2^31-1 字节? (varchar(max)的极限)

    一篇文章需要很长时间才能加载,以至于人们会认为网站已损坏并放弃。不会吧?

    【讨论】:

    • 它们并没有那么长,这也是让我感到奇怪的地方。
    【解决方案4】:

    正如 Matthew 所说,它失败的原因是权限。在 VS 中开发时,通常使用集成的 Visual Studio Web 服务器运行。运行此 Web 服务器时,它是在您登录帐户的权限下运行的,这意味着您可以访问本地 PC 上的几乎所有内容。

    当您部署到生产环境时,您在 IIS 中运行,并且安全权限是您的应用恰好在其中运行的应用程序池的权限。默认情况下,AppPool 在 NetworkService 帐户下运行,这意味着它具有对 PC 上本地资源的访问最少。

    您可以提升 AppPool 的权限,但这是一种不好的做法和安全风险。如前所述,更好的方法是正确使用 SQL Server 中可用的数据类型来存储数据。

    【讨论】: