c# - 远程 IIS 的路径位置

标签 c# iis

我在使用 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 上设置了一个新站点,并使用与该站点同名的应用程序

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”。如果要使用完整路径,PhysicalPath VirtualDirectories 属性的属性是要设置的正确属性。

关于c# - 远程 IIS 的路径位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21770481/

相关文章:

asp.net-mvc - ASP.NET MVC/IIS 7 : Creating dynamic websites (subdomains) with a button click

c# - 事件如何比委托(delegate)更强大

c# - WCF 性能、延迟和可伸缩性

c# - 使用Azure功能处理Azure服务总线队列消息

c# - .Net 程序集加载问题期间出现 BadImageFormatException

c# - UseIISPlatformHandler() 是否正确弃用为 UseIIS()?

c# - 将 Reflection.Emit 转换为 Roslyn

c# - 如何有效地表示一个非常大的位数组?

asp.net-mvc - 在 MVC4 中路由带有扩展名的 url 将不起作用,尝试提供静态文件

asp.net - 如何确定 ASP.NET 应用程序域的生命周期