通过代码动态创建IIS站点

对WebApi进行单元测试时,一般需要一个IIS站点,一般的做法,是通过写一个批处理的bat脚本来实现,其实通过编码,也能实现该功能。

主要有关注三点:应用程序池、Web站点、绑定(协议类型:http、https,IP地址,端口,主机名)

1.总体代码

  var webSite = app.WebSite;

            using (var sm = new ServerManager())
            {
                //创建应用程序池
                var appPool = sm.ApplicationPools.FirstOrDefault(ap => ap.Name.Equals(webSite.PoolName));

                if (appPool == null)
                {
                    CreateAppPool(sm.ApplicationPools, webSite.PoolName);
                }

                //创建Web站点
                var site = sm.Sites.FirstOrDefault(s => s.Name.Equals(webSite.SiteName));

                if (site == null)
                {
                    CreateWebSite(sm.Sites, webSite, app.InstallPath);
                }

                sm.CommitChanges();
            }

  2.创建应用程序池:

 /// <summary>
        /// 创建应用程序池
        /// </summary>
        /// <param name="appPools"></param>
        /// <param name="appPoolName"></param>
        private void CreateAppPool(ApplicationPoolCollection appPools, string appPoolName)
        {
            var appPool = appPools.Add(appPoolName);

            //是否自启动
            appPool.AutoStart = true;
            //队列长度
            appPool.QueueLength = 10000;
            //启动模式
            appPool.StartMode = StartMode.AlwaysRunning;
            //回收时间间隔
            appPool.Recycling.PeriodicRestart.Time = new TimeSpan();
            //闲置超时
            appPool.ProcessModel.IdleTimeout = new TimeSpan();
            //最大工作进程数
            appPool.ProcessModel.MaxProcesses = 1;
        }

  3.创建站点

  /// <summary>
        /// 创建Web站点
        /// </summary>
        /// <param name="sites"></param>
        /// <param name="webSite"></param>
        /// <param name="physicalPath"></param>
        private void CreateWebSite(SiteCollection sites, WebSite webSite, string physicalPath)
        {
            Site site = null;
            bool isSiteCreated = false;

            foreach (var binding in webSite.Bindings)
            {
                var bingdingInfo = ConstructBindingInfo(binding);

                if (!isSiteCreated)
                {
                    site = sites.Add(webSite.SiteName, binding.BindingType, bingdingInfo, physicalPath);

                    //是否自启动
                    site.ServerAutoStart = true;

                    isSiteCreated = true;
                }
                else
                {
                    site.Bindings.Add(bingdingInfo, binding.BindingType);
                }
            }

            var root = site.Applications["/"];

            //设置应用程序池
            root.ApplicationPoolName = webSite.PoolName;
            //设置虚拟目录
            //  root.VirtualDirectories["/"].PhysicalPath = pathToRoot;
            //预加载
            root.SetAttributeValue("preloadEnabled", true);
        }

  4.创建绑定

  /// <summary>
        /// 构建绑定信息
        /// </summary>
        /// <param name="binding"></param>
        /// <returns></returns>
        private string ConstructBindingInfo(WebSiteBinding binding)
        {
            var sb = new StringBuilder();

            if (!string.IsNullOrEmpty(binding.IP))
            {
                sb.Append(binding.IP);
            }
            else
            {
                sb.Append("*");
            }

            sb.Append(":");

            sb.Append(binding.Port);

            sb.Append(":");

            if (!string.IsNullOrEmpty(binding.HostName))
            {
                sb.Append(binding.HostName);
            }
            else
            {
                sb.Append(string.Empty);
            }

            return sb.ToString();
        }

  

原文地址:https://www.cnblogs.com/liugh/p/8684696.html

时间: 2024-10-29 00:53:13

通过代码动态创建IIS站点的相关文章

动态创建IIS站点

对WebApi进行单元测试时,一般需要一个IIS站点,一般的做法,是通过写一个批处理的bat脚本来实现,其实通过编码,也能实现该功能. 主要有关注三点:应用程序池.Web站点.绑定(协议类型:http.https,IP地址,端口,主机名) 1.总体代码 var webSite = app.WebSite; using (var sm = new ServerManager()) { //创建应用程序池 var appPool = sm.ApplicationPools.FirstOrDefaul

利用ansible批量创建iis站点

准备: 系统必须大于等于windows2008 R2 系统 升级 PowerShell至3.0 安装iis 安装net ansible控制台目录结构 . ├── hosts #ansible 存放客户机IP ├── roles │   └── web │       ├── files │       │   └── web.ps1 # 创建iis站点ps脚本 │       └── tasks │           └── main.yml #ansible 控制脚本 └── web.yml

使用appcmd命令创建iis站点及应用程序池

参考文章:iis7 appcmd的基础命令及简单用法 验证环境:Windows 7    IIS7 AppCmd.exe工具所在目录 C:\windows\sytstem32\inetsrv\目录下,所以执行命令前,先把当前目录切换到该目录下: cd C:\Windows\System32\inetsrv 创建iis站点: appcmd add site /name:"MyTestSite1" /bindings:http/*:8990: /physicalPath:"E:\

unity3d通过代码动态创建销毁游戏对象

只能动态创建内部提供的游戏对象,代码如下: //按下C后创建 if (Input.GetKeyDown (KeyCode.C)) { GameObject s1 = GameObject.CreatePrimitive (PrimitiveType.Sphere);//创建 s1.name = "qiu";//命名 s1.GetComponent<MeshRenderer> ().material.color = Color.red;//网格渲染器 s1.transform

Asp.net mvc在view中用C#代码动态创建元素

来自森大科技官方博客 http://www.cnsendblog.com/index.php/?p=1231. 在view中可以用c#代码foreach动态创建元素2. 不加@{}下图中c#代码变成了白色,无法识别了. 原文地址:https://blog.51cto.com/14036626/2357251

C#实现动态发布IIS站点帮助类

准备工作: 1.引用 System.DirectoryServices 系统程序集 2.引用 Microsoft.Web.Administration 程序集,类库位置在 C:\Windows\System32\inetsrv\Microsoft.Web.Administration.dll ,直接拷贝到项目引用即可 3.调用方式: string bing = string.Format("{0}:{1}:{2}", item.BingIp, item.Port, item.BingA

代码动态创建checkbox

根据数据库的内容动态创建Checkbox控件并显示在Panel上 dataset ds=new dataset(); CheckBox[ ] cb=new CheckBox[ds.tables[0].Rows.count]; for(int i=0;i<ds.tables[0].Rows.count;i++) { cb[i]=new checkBox(); cb[i].id=i.tostring(); cb[i].text=ds.table[0].rows[i]["ColName"

针对windowsserver 创建iis站点访问出错的解决方案(HTTP 错误 500.19 - Internal Server Error)

错误如下:   服务器错误 Internet信息服务 7.0 错误摘要HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 详细错误信息模块 IIS Web Core 通知 BeginRequest 处理程序 尚未确定 错误代码 0x80070005 配置错误 由于权限不足而无法读取配置文件 配置文件 \\?\C:\Users\Administrator\Desktop\zzu\web.config 请求的 URL htt

cmd下命令行创建 IIS 站点

windows 创建站点命令 appcmd C:\Windows\System32\inetsrv\appcmd.exe SITE 虚拟站点的管理 APP 管理应用程序 VDIR 管理虚拟目录 APPPOOL 管理应用程序池 CONFIG 管理常规配置节 WP 管理工作进程 REQUEST 管理 HTTP 请求 MODULE 管理服务器模块 BACKUP 管理服务器配置备份 TRACE 使用失败请求跟踪日志 list 列出应用程序池 set 配置应用程序池 add 添加新应用程序池 delete