开发环境:
vs2015,C#,MVC5
做了一个简单的网站,其重点是后台需要访问其它电脑上的共享目录,在调试的时候一切正常,发布版本之后,在服务器上无法正常访问。这个问题在之前也遇到过两次,今天还是需要解决这个问题才行,因为后面碰到这种情况会越来越多。
通过搜索,找到了一个网址:https://www.cnblogs.com/knowledgesea/p/5145087.html
我看了这篇文章,大致思路就是先建立虚拟目录,然后通过虚拟目录来访问。按照这个办法操作,结果发现失败,在iis管理器中,建立的虚拟目录是可以打开的,但在后台代码中仍然无法访问:
建立虚拟目录:804_d1,对应的网络目录为:\\19.8.0.4\video,访问如下:
string vPath = @"\\804_d1\\2021\\3";
if (Directory.Exists(vPath))
{
WriteLog("目录可以访问");
}
else
{
WriteLog("目录访问失败");
}
实际打印出来的是“目录访问失败”,vPath去掉前面的@也是一样,也就是说,@没有起到作用。参考那个网址,加上了个MapPath():
string vPath = @"\\804_d1\\2021\\3";
vPath = Server.MapPath(vPath);
if (Directory.Exists(vPath))
{
WriteLog("目录可以访问");
}
else
{
WriteLog("目录访问失败");
}
结果是一样的,另外发现,通过MapPath()之后,返回的路径就变成了正常的网络路径:\\19.8.0.4\video\2021\3,这样说,这个虚拟路径就没有任何意义了,就是因为像 “\\19.8.0.4\video\2021\3” 这样的网络路径无法访问,才要创建虚拟路径,现在倒好,又把虚拟路径转换成了网络路径。
实在没辙,仔细查看那个网址,发现最后部分有一段,是要在配置文件里加上配置项,位置:在网站根目录下的配置文件web.config中,在节点 configuration/system.web 下添加访问共享目录的用户信息:
<identity impersonate="true" userName="username" password="pwd" />
这样添加之后,
string vPath = @"\\804_d1\\2021\\3";
if (Directory.Exists(vPath))
{
WriteLog("目录可以访问");
}
else
{
WriteLog("目录访问失败");
}
成功打印了“目录可以访问”,再试一下直接访问网络路径:
string vPath = "\\\\19.8.0.4\\video\\2021\\3";
if (Directory.Exists(vPath))
{
WriteLog("目录可以访问");
}
else
{
WriteLog("目录访问失败");
}
发现也是成功的,打印了“目录可以访问”,这样来看,那虚拟目录还有用吗?我把虚拟目录804_d1删除掉,仍然直接访问网络路径,发现还是成功。
如此来说,得出的结论就是:在配置文件中添加访问共享目录的用户名和密码即可,其它乱七八糟的事情统统不需要。
有关ASP.NET的各种配置项参考:https://docs.microsoft.com/zh-cn/previous-versions/dotnet/netframework-4.0/9k6k3k4a(v=vs.100)
后记:
配置中的用户名,需要是系统的用户名,也就是说,在本地也需要建立要访问共享目录的用户帐号,如果没有建立这个帐号,在启动/访问网站时,会提示如下错误:
这个错误是我在F5启动调试的时候,浏览器上提示的,所以这个用户信息非常重要,一旦没有设置好,被用户看到用户名和密码就不好了,可以仔细参考
identity 元素(ASP.NET 设置架构) | Microsoft Docs 来设置一个安全的策略(我还没有设置,后面有空了再来弄这个事)