Visual Studio 当我将代码更改为使用HTTP路径时,ASP.NET应用程序试图使用本地路径打开文件

mgdq6dx1  于 2023-08-07  发布在  .NET
关注(0)|答案(1)|浏览(111)

我正在开发一个ASP.NET应用程序,并一直在使用VisualStudio在本地机器上测试它。当我在那里测试它时,我使用的是本地文件路径,因为我的程序需要从这些文件中读写。当我把我的文件拖放到我的网站文件夹中进行网络测试时,我把文件路径改成了网络文件路径,而不是本地文件路径。然而,当我试图访问这些文件时,我的程序抛出一个错误,它找不到文件路径,并打印我在机器上测试时的本地文件路径。这是它抛出的错误消息,我已经审查了本地路径,但它们与我在本地测试时的本地路径相同。Error message when trying to write to Credentials.xml, which is hosted on the web server
下面是尝试打开文件的函数。

protected void createAccBtn_Click(object sender, EventArgs e)
        {
            string username = createUserIn.Value;
            string password = createPassIn.Value;
            XDocument doc;
            doc = XDocument.Load(@"https://myurl.com/Credentials.xml");
            var element = new XElement("User", new XElement("Username", username), new XElement("Password", password));
            doc.Root.Add(element);
            TestBox.InnerText = doc.ToString();
            doc.Save(@"https://myurl.com/page0/Credentials.xml");

            
        }

字符串
我使用了VS“ASP.NETWebApplicationinC #”模板来设置这个。我假设在文件中的某个地方只有一个保存的引用,它一直试图使用我的本地文件,但我不知道那会在哪里。任何帮助都是感激的。
我已经尝试了清洁和重建解决方案在VS和重新复制,这并没有工作。我也看了很多配置文件,但找不到任何地方引用本地文件。那个文件路径并没有写在我代码的任何地方,所以它一定是我在本地工作时保存的

dm7nw8vv

dm7nw8vv1#

首先,我会在/on/中为您的Web项目创建一些文件夹;比如MyXmlDocs。
通常,如何解析网站的路径名可能会令人困惑。
因此,在您的示例中,我们假设(即使在您的开发计算机上,工作在本地),您创建了(使用从Visual Studio添加)该文件夹。
所以,当然在项目浏览中右键单击,选择添加,然后选择添加文件夹。
例如:
x1c 0d1x的数据
然后添加名为MyXmlDocs的文件夹。
所以,你现在有这个:



好了,现在我们需要一些概念来说明它是如何工作的:
基于Web的URL:
基于Web的URL将是基本根网站名称,然后是文件夹,然后是文档。
所以这个:

http://www.mysite/MyXmlDocs/Credentials.xml

字符串
或者(在本地开发期间)

http://localhost:63267/MyXmlDocs/Credentials.xml


但是,请注意,代码隐藏从不使用基于Web的URL,而是始终使用常规的Windows文件名。这包括文件的FULL PATH名称。
所以
基于Web的URL-来自web site = site/Folder/File
但是,后面的代码:总路径名-像任何常规的Windows文件名!
(And内部,现在文件和文件夹如何使用“\”(反斜杠)。
C#如何处理文件?不管你是在做web开发,还是桌面,或者其他什么。后面的代码仍然像过去一样工作,并且包括正确的Windows文件名。因此,C#/vb.net代码在处理文件名时将要求您使用有效的Windows文件名(和路径)。
因此,很明显,虽然Web服务器(IIS - Internet服务)将为您匹配网站+文件夹+文件名,但这仅适用于使用基于Web的URL到文件夹中的文件名时。
但是,这样的路径名在代码背后是零使用。记住上面的规则:
VB.net或C#代码来读取和使用文件将仍然是常规的Windows代码,因此您需要一个法律的的Windows文件名,而不是基于Web的文件,而不是基于Web的URL来读取/打开/使用/享受使用代码背后。
因此,这意味着我们需要将这些“假定”的Web URL转换为代码中的完整文件名。您使用的方法是Server. MapPath。
让我们运行这段代码。
标记:

<asp:Button ID="Button1" runat="server" 
            Text="Show path names"
            OnClick="Button1_Click"
            />

        <asp:Label ID="Label1" runat="server" 
            Text="">
        </asp:Label>


按钮代码:

protected void Button1_Click(object sender, EventArgs e)
    {
        // show path name to MyExmlDocs/Credentials.xml

        string sFile = Server.MapPath("~/MyXmlDocs/Credentials.xml");

        Label1.Text = sFile;

        //XDocument doc;
        //doc = XDocument.Load(sFile);

    }


测试结果:



所以,正如你所看到的,你真的不关心网站从哪里运行,我们简单地把URL,或者什么是外部URL,并使用Server.MapPath,这将转换基于Web的URL的“内部”完整的法律的窗口文件和路径。
因此,内部代码(代码隐藏)将始终使用正确和法律的的Windows路径名。
基于Web的URL来自站点根。所以,代码背后不像基于Web的URL那样工作,你必须在脑海中保持这两个概念100%分开。
总是问:这是代码背后运行,或者这是一个基于Web的URL?
网站、IIS Web服务,甚至是键入站点中文件夹的法律的路径名,都始终从基站点名称开始。
但是,对于代码隐藏,它仍然始终是常规的Windows法律的文件名。

相关问题