站点图标 江湖人士

自写C#添加网站应用程序池虚拟目录实现网站管理

自写C#添加网站应用程序池虚拟目录实现网站管理,做为一个使用C#语言开发web项目的开发人员,基本上都熟悉一些IIS的管理工作,例如手动在IIS上创建网站,创建应用程序,创建虚拟目录等,那么你是否想过自己实现一个网站管理工具来实现自动建站呢?本文就来阐述如何实现这样的网站管理工具。

如果你还不熟悉怎样怎样在IIS上部署网站,可以阅读下面的这些文章。

  1. 使用VS 2019发布.net core程序并部署到IIS的最新教程
  2. 通过VS2017发布.net core程序并使用Web 部署到远程服务器最新教程
  3. 如何使用IIS发布和运行ASP.NET Core 应用程序

通常来说网站管理工具可以完成一些不通过IIS就可以在Windows服务器上创建网站,创建应用程序池,绑定域名,建立虚拟目录,应用程序等,以及数据库的相关管理工作,这样的工具就是方便小白用户管理网站,国内的有一些提供windows vps或者windows云服务器的服务商也会在你购买的windows vps或者windows云服务器上提供这样的网站管理工具。

闲话少说,下面将分别介绍怎样使用C#代码添加IIS应用程序池、网站、虚拟目录、应用程序等功能,并将添加的应用程序池和网站关联。不过在开始之前,还是展示一下这个示例程序的界面吧:

打包安装程序下载

在源码中,我将该程序打包为了一个安装程序,你可以下载打包后的程序体验一翻,另外需要注意的是,无论你将源码从github上clone下来,还是下载安装程序来体验,都需要使用管理员权限来运行程序或者运行VS2019打开源码才行,不然会报没有权限的错误,毕竟操作IIS是需要管理员权限的

永久下载地址:点击下载

提示:该下载地址是国外的一个网盘,下载时多点击几次即可,因为免费会员会看到广告。

C#代码添加网站操作视频

有些地区是不能访问YouTube,需要使用上网软件才行。

C#添加用程序池

ServerManager serverManager = new ServerManager();
if (textBox4.Text.IsNullOrWhiteSpace())
{
    MessageBox.Show("请输入应用程序池名称");
    return;
}
if (comboBox2.SelectedItem == null)
{
    MessageBox.Show("请选择托管模式");
    return;
}
if (comboBox1.SelectedItem == null)
{
    MessageBox.Show("请选择应用程序标识");
    return;
}
var appool = serverManager.ApplicationPools.Add(textBox4.Text);
appool.ManagedPipelineMode = (ManagedPipelineMode)Enum.Parse(typeof(ManagedPipelineMode), omboBox2.SelectedItem.ToString());
appool.ProcessModel.IdentityType = (ProcessModelIdentityType)Enum.Parse(typeof(ProcessModelIdentityType), omboBox1.SelectedItem.ToString());
serverManager.CommitChanges();

MessageBox.Show("创建应用程序池成功");

正如上面的代码那样,一开始实例化了一个ServerManager对象,这个对象至关重要,在我们通过C#来添加网站、虚拟目录、应用程序池、应用程序时,会一直使用它的,你需要通过Nuget添加命名空间Microsoft.Web.Administration的引用。

添加完应用程序池后,在IIS里面可以看到如下图所示的结果:


C#添加网站

if (textBox1.Text.IsNullOrWhiteSpace())
{
    MessageBox.Show("请输入网站名称");
    return;
}
if (textBox6.Text.IsNullOrWhiteSpace())
{
    MessageBox.Show("请指定网站路径");
    return;
}
if (textBox8.Text.IsNullOrWhiteSpace())
{
    MessageBox.Show("请先创建应用程序池");
    return;
}
try
{
    ServerManager serverManager = new ServerManager();
    Site site = serverManager.Sites.Add(textBox1.Text.Trim(), textBox6.Text, int.Parse(textBox13.Text));
    site.ServerAutoStart = true;
    site.Applications[0].ApplicationPoolName = textBox8.Text;

    site.Bindings.Clear();
    site.Bindings.Add($"{textBox5.Text}:{textBox13.Text}:{textBox2.Text}", "http");  //ip:端口:域名

    serverManager.CommitChanges();

    site.Start();
    MessageBox.Show("创建网站成功!");
}
catch (Exception ex)
{
    MessageBox.Show($"创建网站过程出错,原因:{ex.Message}");
}

最核心的代码就是try catch块里面的创建网站代码,可以看到,依然使用了ServerManager对象来完成网站的创建工作,在创建网站的同时,代码中设置网站为自动启动,即网站创建好了之后就启动网站,之后就为网站设置应用程序池,最后通过调用serverManager.CommitChanges方法提交变更就可以了,这样就完成了网站的创建工作。

添加完网站后,刷新一下IIS就可以看到你刚才添加成功的网站,如下图所示,可以看到已经成功绑定了域名,端口等。

在IIS上查看 C#添加的网站

接下来看看如何通过C#代码来实现添加虚拟目录的功能。


C#添加虚拟目录

C#添加虚拟目录
if (textBox3.Text.IsNullOrWhiteSpace())
{
    MessageBox.Show("请输入虚拟目录名称");
    return;
}
if (textBox7.Text.IsNullOrWhiteSpace())
{
    MessageBox.Show("请输入虚拟目录路径");
    return;
}
if (!Directory.Exists(textBox7.Text))
{
    MessageBox.Show("不要乱输,虚拟目录必须存在!");
    return;
}
try
{
    ServerManager serverManager = new ServerManager();
    var app = serverManager.Sites[comboBox4.SelectedText].Applications[0];
    app.VirtualDirectories.Add($"/{textBox3.Text}", textBox7.Text);

    serverManager.CommitChanges();

    MessageBox.Show("虚拟目录创建成功!");
}
catch (Exception ex)
{
    MessageBox.Show($"创建虚拟目录出错,原因:{ex.Message}");
}

上面的代码也是通过ServerManager对象完成虚拟目录的添加,这里需要注意的是,添加虚拟目录需要使用 / 符号设定路径,小编刚开始没有指定 / 符号,结果报错,加上就对了。

虚拟目录嵌套应用程序

在IIS上实际部署网站的过程中,即可以在虚拟目录里面嵌套应用程序,也可以在应用程序里面嵌套应用程序,就像俄罗斯套娃一样,一个套一个那样都是可以的。

下面的示例代码就是在虚拟目录里面添加应用程序。

if (string.IsNullOrEmpty(comboBox4.SelectedText))
{
    MessageBox.Show("请选择隶属网站,无可选项时请先添加一个网站!");
    return;
}
if (textBox3.Text.IsNullOrWhiteSpace())
{
    MessageBox.Show("请输入虚拟目录名称!");
    return; 
}
if (textBox14.Text.IsNullOrWhiteSpace())
{
    MessageBox.Show("请输入应用程序名称!");
    return;
}
if (!Directory.Exists(textBox15.Text))
{
    MessageBox.Show("不要乱输,应用程序目录必须存在!");
    return;
}

try
{
    ServerManager serverManager = new ServerManager();
    var site = serverManager.Sites[comboBox4.SelectedText];
    var app = site.Applications.Add($"/{textBox3.Text}/{textBox14.Text}", textBox15.Text);
    app.ApplicationPoolName = textBox4.Text;  //设置应用程序池
    serverManager.CommitChanges();

    MessageBox.Show("虚拟目录下创建应用程序池成功!");
}
catch (Exception ex)
{
    MessageBox.Show($"虚拟目录下创建应用程序池出错,原因:{ex.Message}");
}

在虚拟目录里面添加应用程序,只需要像上面try catch块里面的这行代码site.Applications.Add($”/{textBox3.Text}/{textBox14.Text}”, textBox15.Text); 那样,textBox3.Text就是虚拟目录名称,而textBox14.Text就是应用程序名称。添加好了之后如下图所示那样:

使用C#在指定的虚拟目录下添加应用程序
C#在虚拟目录下添加的应用程序

C#添加应用程序

C#代码实现在选定的网站下面添加应用程序
if (string.IsNullOrEmpty(comboBox5.SelectedText))
{
    MessageBox.Show("请选择隶属网站,无可选项时请先添加一个网站!");
    return;
}
try
{
    ServerManager serverManager = new ServerManager();
    var site = serverManager.Sites[comboBox5.SelectedText];
    var app = site.Applications.Add($"/{textBox12.Text}", textBox11.Text);
    app.ApplicationPoolName = textBox4.Text;  //设置应用程序池
    serverManager.CommitChanges();

    MessageBox.Show("站点根目录下创建应用程序池成功!");
}
catch (Exception ex)
{
    MessageBox.Show($"站点根目录下创建应用程序池出错,原因:{ex.Message}");
}
IIS里面查看刚才添加的应用程序

github源码地址:https://github.com/jhrscom/sitemanage

写在最后

以上的代码就是最近的工作中,在编写一个自动回收IIS应用程序池的Windows服务程序,顺手编写的网站管理工具的demo程序,以上代码只是最基本的在IIS上完成添加网站,添加虚拟目录,应用程序,应用程序池等;其实你完全可以通过C#代码添加网站,C#添加用程序池,C#代码为网站添加虚拟目录,C#代码为网站添加应用程序等功能来实现一个自己的网站管理工具。

本身编写这个程序的目的是为了实现内网环境下两台Windows服务器或者多台Windows服务器之间进行站点自动迁移部署,自动在目标服务器上创建网站。运维人员使用时只需要填一下新服务器的IP地址,域名,有证书设置下证书等就可以不用管了,剩下的工作由程序自动从旧服务器上将网站迁移到新服务器上并完成网站搬家部署。

退出移动版