Visual Studio 2022 C# ASP.NET 在服务器上找不到带有服务引用文本文件的 Web 表单(HTTP 错误 404.0)

Visual Studio 2022 C# ASP.NET Webforms with service reference text files not found on server (HTTP Error 404.0)

我目前正在尝试使用 Visual Studio 2022 ASP.NET 带有服务引用的 Webforms 应用程序来创建 Web 服务应用程序。目标是获取信息并将其作为文本文件存储在本地计算机上的项目文件夹中,以便我本地服务器上的 Web 服务可以访问它。

我已成功创建文本文件并可以在我的本地计算机上访问它们,但是当我导航到本地服务器树上的文本文件时,我收到 HTTP 错误 404.0,如下所示。我需要任何访问我的服务器的用户都能够访问保存的文本文件。我试图更改文件夹和我的 web.config 文件中的安全权限,但没有成功。如果有人提出任何建议,我将不胜感激。

这是我将信息保存为文本文件的代码。

// Randomly generate string for text file name
var chars = "abcdefghijklmnopqrstuvwxyz0123456789";
var textFile = new char[4];
var random = new Random();

for (int i = 0; i < textFile.Length; i++)
{
    textFile[i] = chars[random.Next(chars.Length)];
}

eventFile = "\";
eventFile += new String(textFile);
eventFile += ".txt";

folderPath = Server.MapPath("~/Events");

File.WriteAllText(folderPath + eventFile, fullEventDetails);

我的URL和本地文件路径如下:

好的,所以您必须牢记文件映射如何与 IIS 一起工作。

你背后的代码:

那是飞机简.net代码。大多数情况下,任何代码、任何文件操作都使用完全限定的 windows 路径名。就像编写桌面软件一样。在大多数情况下,这意味着隐藏代码可以 grab/use/look 在您计算机上的任何文件中。

但是,在实践中,当您使用一个完整的 Web 服务器时 运行ning ISS(您在使用 VS 和 IIS Express 进行开发期间并没有真正这样做)?通常,出于安全原因,只有 wwwroot 文件夹中的文件被授予访问 Web 服务器的权限。

但是,您在您的开发计算机上工作 - 您实际上是一个超级用户,并且您(更重要的是)您的代码因此可以 read/write 并在您的计算机上获取和使用任何文件计算机。

因此,请牢记以上内容:

代码背后=飞机简windows文件操作。

然后我们有来自网页端的请求(来自网页,或者您在网络浏览器中输入的URL。

在这种情况下,文件只会映射到项目的根目录,然后是子文件夹。

因此,您可以 up-load 一个文件,然后使用代码将文件保存到计算机上的任何位置。

但是,基于 Web 的文件 (urls) 仅通过网站进行映射。

因此,实际上,您必须将 VS Web 项目视为根文件夹。如果您发布到真实的网络服务器,情况就是如此。

因此,如果您有项目文件夹,则可以向该项目添加子文件夹。

比如,我们添加一个名为 UpLoadFiles 的文件夹。 (并确保使用 VS 添加该文件夹)。所以我们右键点击项目,选择add->

因此,您右键单击基础项目并添加,如下所示:

所以,这将简单地在您的项目中创建一个子文件夹,您会看到它是这样的:

因此,该文件夹必须位于根目录中,或者至少从您的项目所在的根文件夹或基础文件夹开始。

所以,对于上面的内容,然后使用 UpLoadFiles,然后任何基于 WEB 的路径名 (url) 将是这样的:

https://localhost:44399/UpLoadFiles/sx1l.txt

(假设我们将文件放在文件夹 UpLoadFiles 中)。

但是,如果您想将代码写入 touch/use/read/save 并使用该文件?

你需要将上面的url翻译成那个平面jane windows路径名。 (对于后面的任何代码)。

那么,如果我想在代码中读取该文件名?

然后我会用 Server.MapPath() 来翻译这个 url.

这样说:

string strFileName = "sx1l.txt";
string strFolderName = "UpLoadFiles"

string strInternaleFileName = server.MapPath(@"~/" + strFolderNme + @"/" + sx1l.txt";

// ok, so now we have the plane jane windows file name. It will resolve to something like say this:

C:\Users\AlbertKallal\source\repos\MyCalendar\UpLoadFiles\sx1l.txt

我的意思是我真的不在乎,但是 Web 服务器代码可能 运行ning 在某些服务器上并且路径名可能比上面的更难看 - 但我的开发人员不在乎.

但是,从网络浏览器和网络服务器的角度来看 (URL),上面的内容将如下所示:

https://localhost:44392/UpLoadFiles/sx1l.txt

在标记中,我可以说一个超级 link 例如:

        <a href="UpLoadFiles/sx1l.txt">UpLoadFiles/sx1l.txt</a>

因此,请在使用路径名时CRYSTAL头脑清醒。

Web based URL, or markup = relative path name, ONLY root or sub folders allowed

code behind: ALWAYS will use a plane jane full windows standard file and path.

但是,如果您拥有庞大的网络附加存储计算机 - 比如说大量 PDF 安全文档或零件图片目录,那又如何呢?

那你就可以采纳和使用我们所谓的“虚拟”文件夹了。在 IIS Express 中设置它们很痛苦,但如果您使用 IIS 设置并且 运行 您要将站点发布到的最终服务器,则设置起来真的很容易。

可以这么说,虚拟文件​​夹允许您将 EXTERNAL 文件夹映射到您端的根路径名。

所以,你可能会说有大量 PDF 文档的大型服务器,

\corporate-server1\PDF\Documents

所以,在IIS中,你可以添加上面的路径名,比如一个名为PDF的文件夹。

这样说:

因此,当您执行上述操作时,该文件夹将像项目根目录中的任何 plane jane 文件夹一样出现,但文件路径可以并且将位于 wwwroot 文件夹之外的完全不同的位置网站。

所以,现在我们已经清楚了上面的内容了吗?

\Mac\Home\Desktop\Homework3\Homework3\sx1l.txt

但是,您的代码是这样的:

folderPath = Server.MapPath("~/Events");

File.WriteAllText(folderPath + eventFile, fullEventDetails);

(你错过了上面的尾随“/”,你需要这个:

File.WriteAllText(folderPath + @"/" + eventFile, fullEventDetails);

所以,这意味着文本文件的 url 将是:

https://localhost:44399/Events/sx1l.txt

并且如果您使用 Visual Studio 将文件添加到该文件夹​​(添加->现有项目),那么请确保您构建->全部重建(否则该文件将不会包含在调试中 运行 + 启动 IIS Express。

因此,假设您保存到一个名为 Events 的文件夹(作为 wwwroot 的子文件夹,或者您的 hte 网站的基本文件夹,那么上面是您应该使用的 url,但是您的代码总是缺少文件夹和文件名之间的“/”。