c#绝对路径共享驱动器

时间:2018-03-28 09:56:03

标签: c# webserver absolute-path

我正在尝试使用C#代码获取托管在我的Web服务器上的WCF服务文件夹的路径。我使用以下逻辑来获取路径:

 string codeBase = Assembly.GetExecutingAssembly().CodeBase;
 UriBuilder uri = new UriBuilder(codeBase);
 string path1 = Uri.UnescapeDataString(uri.Path);
 string path2 = Path.GetDirectoryName(path1);
 path2 = path2.Substring(0, path2.LastIndexOf("\\"));

当我在本地计算机上运行此代码时,它从驱动器号开始给出了正确的路径,例如" D:\ appdir \ servicehost \"。但是,当我在我的Web服务器上运行它时,它无法按预期工作,因为我的Web服务器上的IIS虚拟目录指向指向其他计算机的共享位置。在这种情况下,省略了初始IP地址部分,它直接从共享驱动器名称开始,如

"\SharedFolder\servicehost\"

相反,我期待代码返回整个路径。当服务托管在本地驱动器上时,它应该给我" D:....."当它托管在共享驱动器上时,它应该给我一个包含IP地址的路径,如" \\ 10.44.22.11 \ SharedFolder \ servicehost"

这导致我的Web服务器上的文件加载逻辑失败,其代码与本地计算机相同,因为它找不到位于错误位置的文件,该文件排除了IP地址。

因此,我决定使用" URI"包含从" file://.."开始的dll文件的整个路径的字符串。所以我可以剪切"文件:" part和dll命名字符串的一部分并获取整个路径。但这似乎并不是正确的方法,我相信在这两种情况下都会有更复杂的方法来实现它。

是否有任何常见的编码方式,我可以在这两种场景中使用它来获得完整的路径?

1 个答案:

答案 0 :(得分:0)

我根据图片创建了一个新的IIS应用程序池: here 对我来说重要的是将NetworkService设置为身份帐户,否则我无法访问网络。

然后我在另一台服务器上创建了一个共享来保存我的TestWcfService并将IIS应用程序指向它:

enter image description here

此外,文件系统上的ACL设置为EVERYONEFULL CONTROL以便于测试。

该服务有这一行:

String result = String.Format("HostingEnvironment.MapPath: {0}", HostingEnvironment.MapPath("~\\MyFile.txt"));

在我的测试客户端中导致此输出:

HostingEnvironment.MapPath: \\Company\Shares\1 - JayV\TestWcfService\MyFile.txt

要在Wcf服务内部访问该文件,请使用上述HostingEnvironment.MapPath的返回值。

要从客户端远程访问文件,请使用:http://localhost/Remote/myfile.txt

我的虚拟应用程序没有其他虚拟子目录,Wcf服务是从此虚拟应用程序运行而不是从根网站运行