今天在琢磨网站隔段时间打开很卡的情况,百度呗,各种尝试,走着走着突然发现一个能生成脚本的东西。
还有熟悉的C#,其他的无视,基本也不会。难道能用程序挂个站撒的?
查了查,果然有这么个东西。。。https://www.cnblogs.com/zhaochengshen/p/7976894.html
借来引用下:
C# IIS站点管理--Microsoft.Web.Administration.dll
Microsoft中提供了管理IIS7及以上版本一个非常强大的API - Microsoft.Web.Administration.dll,利用该API可以让我们很方便的以编程的方式管理和设定IIS的各项配置信息了。
Microsoft.Web.Administration.dll位于IIS目录下(%WinDir%\System32\InetSrv)下,在项目中添加引用后就可以使用这些API了。
目前挂站成功,一些需要的配置都能直接搞定。以后就不用各种配了,自己配置好了上去跑一下,瞬间完事。
using System;
using Microsoft.Web.Administration;
using System.Collections.Generic;
using System.Linq;
namespace iis
{
class Program
{
/// <summary>
/// 自动挂站
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//CreateWebSite("testweb", 5678, "D:\\testweb\\testweb\\testweb");
CreateWebSite("testweb", new List<HttpAndProt>() { new HttpAndProt() { HostName="www.test.com", Prot=8099 } }, "D:\\testweb\\testweb\\testweb");
}
/// <summary>
/// 创建站点
/// </summary>
/// <param name="SiteName">站点名称</param>
/// <param name="HttpAndProtList"></param>
/// <param name="Path">站点路径 "D:\\testweb\\testweb\\testweb" @"D:\testweb\testweb\testweb" 直接单斜线会出异常</param>
/// <param name="Framework">版本 默认v4.0</param>
/// <param name="StartMode"></param>
/// <param name="MaxProcesses"></param>
/// <param name="RecoveryTime"></param>
/// <param name="IdleTime"></param>
static void CreateWebSite(string SiteName, List<HttpAndProt> List, string Path, string Framework = "v4.0", StartMode StartMode = StartMode.AlwaysRunning, int MaxProcesses = 1, long RecoveryTime = 0, long IdleTime = 0)
{
#region 基础设置
using (ServerManager serverManager = new ServerManager())
{
//判断应用程序池是否存在,可以使用linq
if (serverManager.ApplicationPools[SiteName] != null)
serverManager.ApplicationPools.Remove(serverManager.ApplicationPools[SiteName]);
//判断web应用程序是否存在
if (serverManager.Sites[SiteName] != null)
serverManager.Sites.Remove(serverManager.Sites[SiteName]);
//添加web应用程序池
ApplicationPool appPool = serverManager.ApplicationPools.Add(SiteName);
appPool.AutoStart = true;//启动
appPool.QueueLength = 10000;
appPool.ManagedRuntimeVersion = Framework;//Framework版本(注意版本号大小写问题)
appPool.StartMode = StartMode;//启动模式
appPool.Recycling.PeriodicRestart.Time = new TimeSpan(RecoveryTime);//回收时间间隔
appPool.ProcessModel.IdleTimeout = new TimeSpan(IdleTime);//闲置超时
appPool.ProcessModel.MaxProcesses = MaxProcesses;//最大工作进程数
appPool.SetAttributeValue("enable32BitAppOnWin64", false);//启用32为应用程序
//建立web应用程序 【站点名称 bindingProtocol(http) bindingInformation(主机头等信息) 路径】
var Site = serverManager.Sites.Add(SiteName, "http", GetBindingInformation(List), Path);
Site.ApplicationDefaults.SetAttributeValue("preloadEnabled", true);
Site.Applications[0].ApplicationPoolName = SiteName;//设置应用程序池
//保存
serverManager.CommitChanges();
}
#endregion
#region 配置器设置
using (ServerManager serverManager = new ServerManager())
{
//serverManager.Sites[SiteName].SetMetadata("preloadEnabled", true);
//var SiteBindings = serverManager.Sites[SiteName].Bindings;
//SiteBindings.Add("www.website1.com:80", "http");
//SiteBindings.Add("website1.com:80","http");
//获取网站配置
Configuration config = serverManager.GetWebConfiguration(SiteName);
//重新启动后执行应用初始化
ConfigurationSection applicationInitializationSection = config.GetSection("system.webServer/applicationInitialization");
//设置为true
applicationInitializationSection["doAppInitAfterRestart"] = true;
ConfigurationElementCollection applicationInitializationCollection = applicationInitializationSection.GetCollection();
//清理初始化页
applicationInitializationCollection.Clear();
//如果没有对应路径会异常
ConfigurationElement addElement = applicationInitializationCollection.CreateElement("add");
addElement["initializationPage"] = @"/Home/Index";
//addElement["hostName"] = @"";
applicationInitializationCollection.Add(addElement);
ConfigurationElement addElement1 = applicationInitializationCollection.CreateElement("add");
addElement1["initializationPage"] = @"/HousingResources/Index";
applicationInitializationCollection.Add(addElement1);
ConfigurationElement addElement2 = applicationInitializationCollection.CreateElement("add");
addElement2["initializationPage"] = @"/Index";
applicationInitializationCollection.Add(addElement2);
//保存
serverManager.CommitChanges();
}
#endregion
}
/// <summary>
/// 创建站点
/// </summary>
/// <param name="SiteName">站点名称</param>
/// <param name="HttpAndProtList">http:</param>
/// <param name="Path">站点路径 "D:\\testweb\\testweb\\testweb" @"D:\testweb\testweb\testweb" 直接单斜线会出异常</param>
/// <param name="Framework">版本 默认v4.0</param>
/// <param name="StartMode"></param>
/// <param name="MaxProcesses"></param>
/// <param name="RecoveryTime"></param>
/// <param name="IdleTime"></param>
static void CreateWebSite(string SiteName, int Prot, string Path,string Framework = "v4.0", StartMode StartMode = StartMode.AlwaysRunning, int MaxProcesses = 1,long RecoveryTime = 0,long IdleTime = 0)
{
#region 基础设置
using (ServerManager serverManager = new ServerManager())
{
//判断应用程序池是否存在,可以使用linq
if (serverManager.ApplicationPools[SiteName] != null)
serverManager.ApplicationPools.Remove(serverManager.ApplicationPools[SiteName]);
//判断web应用程序是否存在
if (serverManager.Sites[SiteName] != null)
serverManager.Sites.Remove(serverManager.Sites[SiteName]);
//添加web应用程序池
ApplicationPool appPool = serverManager.ApplicationPools.Add(SiteName);
appPool.AutoStart = true;//启动
appPool.QueueLength = 10000;
appPool.ManagedRuntimeVersion = Framework;//Framework版本(注意版本号大小写问题)
appPool.StartMode = StartMode;//启动模式
appPool.Recycling.PeriodicRestart.Time = new TimeSpan(RecoveryTime);//回收时间间隔
appPool.ProcessModel.IdleTimeout = new TimeSpan(IdleTime);//闲置超时
appPool.ProcessModel.MaxProcesses = MaxProcesses;//最大工作进程数
appPool.SetAttributeValue("enable32BitAppOnWin64", false);//启用32为应用程序
//建立web应用程序 【站点名称 程序池名称 绑定信息(域名IP主机端口) 路径】
var Site = serverManager.Sites.Add(SiteName, Path, Prot);
//var Site = serverManager.Sites.Add(SiteName, "http", GetBindingInformation(HttpAndProtList), Path);
Site.ApplicationDefaults.SetAttributeValue("preloadEnabled", true);
Site.Applications[0].ApplicationPoolName = SiteName;//设置应用程序池
//保存
serverManager.CommitChanges();
}
#endregion
#region 配置器设置
using (ServerManager serverManager = new ServerManager())
{
//serverManager.Sites[SiteName].SetMetadata("preloadEnabled", true);
//var SiteBindings = serverManager.Sites[SiteName].Bindings;
//SiteBindings.Add("www.website1.com:80", "http");
//SiteBindings.Add("website1.com:80","http");
//获取网站配置
Configuration config = serverManager.GetWebConfiguration(SiteName);
//重新启动后执行应用初始化
ConfigurationSection applicationInitializationSection = config.GetSection("system.webServer/applicationInitialization");
//设置为true
applicationInitializationSection["doAppInitAfterRestart"] = true;
ConfigurationElementCollection applicationInitializationCollection = applicationInitializationSection.GetCollection();
//清理初始化页
applicationInitializationCollection.Clear();
ConfigurationElement addElement = applicationInitializationCollection.CreateElement("add");
addElement["initializationPage"] = @"/Home/Index";
//addElement["hostName"] = @"";
applicationInitializationCollection.Add(addElement);
ConfigurationElement addElement1 = applicationInitializationCollection.CreateElement("add");
addElement1["initializationPage"] = @"/HousingResources/Index";
applicationInitializationCollection.Add(addElement1);
ConfigurationElement addElement2 = applicationInitializationCollection.CreateElement("add");
addElement2["initializationPage"] = @"/Index";
applicationInitializationCollection.Add(addElement2);
//保存
serverManager.CommitChanges();
}
#endregion
}
/// <summary>
/// 组装绑定数据 http:192.168.0.119:80:www.test.net
/// </summary>
/// <param name="List"></param>
/// <returns></returns>
static string GetBindingInformation(List<HttpAndProt> List)
{
string Result = "";
foreach (var Info in List)
{
Result += Info.IP +":"+ Info.Prot+":"+ Info.HostName + ",";
}
if (Result.Length > 0)
{
Result = Result.TrimEnd(',');
}
return Result;
}
}
/// <summary>
/// 构建绑定数据
/// </summary>
class HttpAndProt
{
/// <summary>
/// IP(默认*)
/// </summary>
public string IP { get; set; } = "*";
/// <summary>
/// 端口(默认80)
/// </summary>
public int Prot { get; set; } = 80;
/// <summary>
/// 主机名/域名(默认"")
/// </summary>
public string HostName { get; set; } = "";
}
}