对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();
}

  

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

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

    参考文章:iis7 appcmd的基础命令及简单用法 验证环境:Windows 7    IIS7 AppCmd.exe工具所在目录 C:\windows\sytstem32\inetsrv\目录下, ...

  2. C# 创建iis站点以及IIS站点属性,iis不能启动站点

    DontLog = False是否将客户端的请求写入日志文件 2011年04月09日 #region CreateWebsite 新增网站 public string CreateWebSite(st ...

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

    只能动态创建内部提供的游戏对象,代码如下: //按下C后创建 if (Input.GetKeyDown (KeyCode.C)) { GameObject s1 = GameObject.Create ...

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

    准备工作: 1.引用 System.DirectoryServices 系统程序集 2.引用 Microsoft.Web.Administration 程序集,类库位置在 C:\Windows\Sys ...

  5. 代码动态创建checkbox

    根据数据库的内容动态创建Checkbox控件并显示在Panel上 dataset ds=new dataset(); CheckBox[ ] cb=new CheckBox[ds.tables[0]. ...

  6. [2015-11-23]分享一个批处理脚本,创建iis站点及程序池

    建站批处理 batch_createSites.bat @echo off rem 以管理员身份执行本脚本,可添加多条call 以建立多个站点 call path\to\createSites.bat ...

  7. C#创建IIS站点及相应的应用程序池,支持IIS6.0+Windows Server 2003. 使用Builder设计模式

    测试项目结构: PS:IIS6UtilsBuilder, IIS7UtilsBuilder,IISUtilsBuilder以及IISDirector为Builder设计模式实现的核心代码.Progra ...

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

    错误如下:   服务器错误 Internet信息服务 7.0 错误摘要HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 详 ...

  9. cmd 批处理创建 IIS 站点

    windows 创建站点命令 appcmd C:\Windows\System32\inetsrv\appcmd.exe SITE 虚拟站点的管理 APP 管理应用程序 VDIR 管理虚拟目录 APP ...

随机推荐

  1. 【链表】Linked List Cycle II

    题目: Given a linked list, return the node where the cycle begins. If there is no cycle, return null. ...

  2. sql日期格式处理

    sql server中使用convert来取得datetime数据类型样式(全) 日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, 20) 结果:2007-02-01 ...

  3. Dock的生态开源技术(Etcd&Machine&Compose&Swarm&Mesos&Kubernetes)

    Etcd CoreOS公司开源的高可用分布式键值数据库Etcd,该项目已经被广泛应用到分布式系统的一致性实现和服务发现中,基于Go语言实现. Etcd就是专门为集群环境设计,可以很好地实现数据一致性, ...

  4. Maven可以提交到官方公共仓库maven.org

    参考http://central.sonatype.org/pages/ossrh-guide.html这个网址的操作,即可提交到maven.org. 这里有具体的实践方法:http://blog.c ...

  5. SharePoint 2013 EventHanlder工具

    之前在07的时候使用SharePoint Event Receiver Manager (2007 & 2010)来管理SharePoint的Event Handler,但是2013后作者没有 ...

  6. 使用vue2+Axios+Router 之后的总结以及遇到的一些坑

    构建 vue有自己的脚手架构建工具vue-cli,使用起来非常方便,使用webpack来集成各种开发便捷工具,比如: 代码热更新,修改代码之后网页无刷新改变,对前端开发来说非常的方便 PostCss, ...

  7. [Codeforces 993E]Nikita and Order Statistics

    Description 题库链接 给你一个长度为 \(n\) 的序列 \(A\) ,和一个数 \(x\) ,对于每个 \(i= 0\sim n\) ,求有多少个非空子区间满足恰好有 \(i\) 个数 ...

  8. hadoop学习笔记(六):HDFS文件的读写流程

    一.HDFS读取文件流程: 详解读取流程: Client调用FileSystem.open()方法: 1 FileSystem通过RPC与NN通信,NN返回该文件的部分或全部block列表(含有blo ...

  9. *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<WKWebViewConfiguration 0x1701bcd20> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the k

    问题描述: ionic项目,windows下正常,打包android可正常运行: 因为需要打包到iPhone (ios 11.0.1)上测试,将代码拿到Mac OS环境下(重新npm install. ...

  10. RabbitMQ.NET In Window Service

    工作中要求使用RabbitMQ,以Windows Service 模式启动,中间有遇到一些问题,网上大部分博客有误导倾向, 在这里做一个简单的记录,以免后面的人走坑: 1. 自动重新连接,不需要手动处 ...