我在使用 Internet 信息系统时遇到了一个独特的问题。
我有几个托管网站。每个站点都包含一个应用程序池 和网站。但是,当他们离开他们的付费状态并过期时。我设计了一项服务来修改网站物理路径。
一个例子:
private static void ExpireSite(string url)
{
using(ServerManaged manager = new ServerManager())
{
Site expire = manager.Sites[url];
expire.Applications[url].Path = @"C:\inetpub\wwwroot\Expired";
manager.CommitChanges();
}
}
它不会修改路径,但我确实设法得到一个无效路径错误。
url
参数匹配 IIS 根文件夹中的网站名称和目录。
我关注了 Microsoft Developer Network,但不幸的是这篇文章并没有很好地概述这个过程。
有谁知道这是否是找到物理路径的正确方法?这篇 MSDN 文章是否准确?
我想补充一点,记录的方法不起作用:
private static void ExpireSite(string url)
{
using(ServerManaged manager = new ServerManager())
{
Site expire = manager.Sites[url];
expire.Applications[url].VirtualDirectories["/"].PhysicalPath = @"C:\inetpub\wwwroot\Expired";
manager.CommitChanges();
}
}
两种方式我都收到同样的错误。
更新:
为了论证,我进行了一些额外的测试;我有大约三百个网站。当我运行时:
using(ServerManager manager = new ServerManager())
{
Site domain = manager.Sites[url];
foreach(Application app in expire.Applications)
{
Console.WriteLine(domain.Id);
Console.WriteLine(domain.Name);
Console.WriteLine(app.Path);
}
}
它检索它们的数据,但它们都有相同的路径 /
。这似乎不正确;所以如果我使用这个:
domain.Applications[@"/"].VirtualDirectories[@"/"].PhysicalPath = @"C:\inetpub\wwwroot\Expired";
它确实改变了路径,但它们是否都应该包含 /
路径?
最佳答案
新答案
首先,我仍然支持 Application.Path 的说法。信息没有被正确使用。 Path 是虚拟路径而不是物理路径。其次,我认为您获取目标应用程序的原始代码的问题是一个简单的问题。也就是说,您应该使用的字符串是“/”+ url 而不仅仅是 url。
为了演示这一点,我在我的本地 IIS 上设置了一个新站点,并使用与该站点同名的应用程序
站点下应用的物理路径可以在这里看到:
然后我整理了一个方法来获取目标站点“mylocalsite.hereiam.com”,它下面的同名应用程序,然后尝试使用应用程序的 Path 属性和默认虚拟目录更新路径应用的物理路径。
public static void SetPathTest()
{
using (var manager = new ServerManager())
{
const string Url = "mylocalsite.hereiam.com";
var targsite = manager.Sites[Url];
var targapp = targsite.Applications["/" + Url];
var worked = false;
Console.WriteLine("App path: {0}", targapp.Path);
try
{
targapp.Path = @"C:\Projects\Demos\OData\Station.ODataNew";
Console.WriteLine("Setting Path using Path worked!");
worked = true;
}
catch (Exception)
{
Console.WriteLine("Oops. Path isn't settable this way");
}
if (!worked)
{
try
{
targapp.VirtualDirectories["/"].PhysicalPath = @"C:\Projects\Demos\OData\Station.ODataNew";
Console.WriteLine("Setting path using the Virtual directory worked!");
}
catch (Exception)
{
Console.WriteLine("Oops. Virtual directory PhysicalPath isn't settable this way");
}
}
manager.CommitChanges();
}
}
运行结果为:
并且物理路径被改变了:
希望这比第一次复习更有帮助。
旧答案
我认为基于 Application.Path 文档中的文档,您输入属性的值应该是“/Expired”而不是“C:\inetpub\wwwroot\Expired”。如果要使用完整路径,PhysicalPath VirtualDirectories 属性的属性是要设置的正确属性。
关于c# - 远程 IIS 的路径位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21770481/