远程IIS的路径位置

时间:2014-02-14 03:48:57

标签: c# iis

我遇到了互联网信息系统的一个独特问题。

我有几个托管网站。每个站点都包含应用程序池 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";

确实改变了路径,但它们是否都包含/路径?

1 个答案:

答案 0 :(得分:4)

新答案

首先,我仍然坚持Application.Path信息未正确使用的说法。路径意味着虚拟路径而不是物理路径。其次,我认为使用原始代码获取目标应用程序的问题是一个简单的问题。也就是说,你应该使用的字符串是“/”+ url而不仅仅是url。

为了证明这一点,我在本地IIS上设置了一个新站点,其中一个应用程序使用与站点相同的名称

IIS Setup

网站下的应用程序的物理路径可以在这里看到:

Physical Path Original

然后,我将一个方法放在一起,以获取目标网站“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();
        }
    }

运行它的结果是:

Result

物理路径发生了变化:

Physical Path Changed

希望这比第一次使用更有帮助。

旧答案

我认为根据Application.Path文档中的文档,您放入属性的值应为“/ Expired”而不是“C:\ inetpub \ wwwroot \ Expired”。如果要使用完整路径,VirtualDirector属性的PhysicalPath是要设置的正确属性。