我遇到了互联网信息系统的一个独特问题。
我有几个托管网站。每个站点都包含应用程序池和 Web站点。但是,当他们离开付费状态并过期时。我设计了一项服务来修改网站物理路径。
一个例子:
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文件夹中的网站名称和目录匹配。
我已经关注了微软开发者网络,但不幸的是,这篇文章没有很好地概述这个过程。
有谁知道这是否是找到物理路径的正确方法?这篇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();
}
}
我两种方式都收到同样的错误。
更新
为了争论,我进行了一些额外的测试;我有大约300个网站。我跑的时候:
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";
确实改变了路径,但它们是否都包含/
路径?
答案 0 :(得分:4)
首先,我仍然坚持Application.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”。如果要使用完整路径,VirtualDirector属性的PhysicalPath是要设置的正确属性。