原文:http://www.knowsky.com/534237.html

Microsoft自Windows Vista一起发布了IIS 7.0,这个已经是去年的话题了,随后,由.NET开发的Web程序便逐步从IIS 6.0过渡到IIS 7.0上了。IIS 7.0提供了很多比上一版本更多的新特性,包括完全模块化的组件、文本文件的配置功能、MMC图形模式管理工具等等,并且与.NET编程语言结合得更加紧密了,在新添加的Microsoft.Web.Administration名称空间中也增加了很多用于管理和访问IIS的对象,从而使得通过编程方式操作IIS更加简便。虽然在IIS 6.0时代我们也可以非常轻松地通过C#来管理服务器的IIS,但相对来说,现在需要编写的代码更少,所能完成的功能更强。以下是我在曾经做的一个项目中所写的一个类库中的一部分,主要实现了对IIS 7.0的操作,包括创建和删除站点、创建和删除虚拟目录、创建和删除应用程序池、添加站点默认文档、判断站点和虚拟目录是否存在、以及检查Bindings信息等。

对于IIS 7.0的介绍读者如果有兴趣的话可以看看下面的两篇文章,我觉得不错!

http://blog.joycode.com/scottgu/archive/2007/04/08/100650.aspx

http://msdn.microsoft.com/en-us/magazine/cc163453.aspx

不说废话了,赶紧贴代码吧。

首先是对站点的管理。我写了一个相对较为通用的私有方法,然后在对外的方法中给出了调用接口,包括了创建站点时应用程序池的创建和权限的管理。

CreateSite 
/// <summary> 
/// Create a new web site. 
/// </summary> 
/// <param name="siteName"></param> 
/// <param name="bindingInfo">"*:&lt;port&gt;:&lt;hostname&gt;" <example>"*:80:myhost.com"</example></param> 
/// <param name="physicalPath"></param> 
public static void CreateSite(string siteName, string bindingInfo, string physicalPath) 

    createSite(siteName, "http", bindingInfo, physicalPath, true, siteName + "Pool",PRocessModelIdentityType.NetworkService, null, null, ManagedPipelineMode.Integrated, null); 
}

private static void createSite(string siteName, string protocol, string bindingInformation, string physicalPath, 
        bool createAppPool, string appPoolName, ProcessModelIdentityType identityType, 
        string appPoolUserName, string appPoolPassWord, ManagedPipelineMode appPoolPipelineMode, string managedRuntimeVersion) 

    using (ServerManager mgr = new ServerManager()) 
    { 
        Site site = mgr.Sites.Add(siteName, protocol, bindingInformation, physicalPath);

// PROVISION APPPOOL IF NEEDED 
        if (createAppPool) 
        { 
            applicationPool pool = mgr.ApplicationPools.Add(appPoolName); 
            if (pool.ProcessModel.IdentityType != identityType) 
            { 
                pool.ProcessModel.IdentityType = identityType; 
            } 
            if (!String.IsNullOrEmpty(appPoolUserName)) 
            { 
                pool.ProcessModel.UserName = appPoolUserName; 
                pool.ProcessModel.Password = appPoolPassword; 
            } 
            if (appPoolPipelineMode != pool.ManagedPipelineMode) 
            { 
                pool.ManagedPipelineMode = appPoolPipelineMode; 
            }

site.Applications["/"].ApplicationPoolName = pool.Name; 
        }

mgr.CommitChanges(); 
    } 
}
     这个是删除站点的方法,比较简单。

DeleteSite 
/// <summary> 
/// Delete an existent web site. 
/// </summary> 
/// <param name="siteName">Site name.</param> 
public static void DeleteSite(string siteName) 

    using (ServerManager mgr = new ServerManager()) 
    { 
        Site site = mgr.Sites[siteName]; 
        if (site != null) 
        { 
            mgr.Sites.Remove(site); 
            mgr.CommitChanges(); 
        } 
    } 
}
    然后是对虚拟目录的操作,包括创建和删除虚拟目录,都比较简单。

CreateVDir 
public static void CreateVDir(string siteName, string vDirName, string physicalPath)

    using (ServerManager mgr = new ServerManager()) 
    { 
        Site site = mgr.Sites[siteName]; 
        if (site == null) 
        { 
            throw new ApplicationException(String.Format("Web site {0} does not exist", siteName)); 
        } 
        site.Applications.Add("/" + vDirName, physicalPath); 
        mgr.CommitChanges(); 
    } 
}
DeleteVDir 
public static void DeleteVDir(string siteName, string vDirName) 
{    
    using (ServerManager mgr = new ServerManager()) 
    { 
        Site site = mgr.Sites[siteName]; 
        if (site != null) 
        { 
            Microsoft.Web.Administration.Application app = site.Applications["/" + vDirName]; 
            if (app != null) 
            { 
                site.Applications.Remove(app); 
                mgr.CommitChanges(); 
            } 
        } 
    } 
}
    删除应用程序池。

DeletePool 
/// <summary> 
/// Delete an existent web site app pool. 
/// </summary> 
/// <param name="appPoolName">App pool name for deletion.</param> 
public static void DeletePool(string appPoolName) 

    using (ServerManager mgr = new ServerManager()) 
    { 
        ApplicationPool pool = mgr.ApplicationPools[appPoolName]; 
        if (pool != null) 
        { 
            mgr.ApplicationPools.Remove(pool); 
            mgr.CommitChanges(); 
        } 
    } 
}
    在站点上添加默认文档。

AddDefaultDocument 
public static void AddDefaultDocument(string siteName, string defaultDocName) 

    using (ServerManager mgr = new ServerManager()) 
    { 
        Configuration cfg = mgr.GetWebConfiguration(siteName); 
        ConfigurationSection defaultDocumentSection = cfg.GetSection("system.webServer/defaultDocument"); 
        ConfigurationElement filesElement = defaultDocumentSection.GetChildElement("files"); 
        ConfigurationElementCollection filesCollection = filesElement.GetCollection();

foreach (ConfigurationElement elt in filesCollection) 
        { 
            if (elt.Attributes["value"].Value.ToString() == defaultDocName) 
            { 
                return; 
            } 
        }

try 
        { 
            ConfigurationElement docElement = filesCollection.CreateElement(); 
            docElement.SetAttributeValue("value", defaultDocName); 
            filesCollection.Add(docElement); 
        } 
        catch (Exception) { }   //this will fail if existing

mgr.CommitChanges(); 
    } 
}
     检查虚拟目录是否存在。

VerifyVirtualPathIsExist 
public static bool VerifyVirtualPathIsExist(string siteName, string path) 

    using (ServerManager mgr = new ServerManager()) 
    { 
        Site site = mgr.Sites[siteName]; 
        if (site != null) 
        { 
            foreach (Microsoft.Web.Administration.Application app in site.Applications) 
            { 
                if (app.Path.ToUpper().Equals(path.ToUpper())) 
                { 
                    return true; 
                } 
            } 
        } 
    }

return false; 
}
     检查站点是否存在。

VerifyWebSiteIsExist 
public static bool VerifyWebSiteIsExist(string siteName) 

    using (ServerManager mgr = new ServerManager()) 
    { 
        for (int i = 0; i < mgr.Sites.Count; i++) 
        { 
            if (mgr.Sites[i].Name.ToUpper().Equals(siteName.ToUpper())) 
            { 
                return true; 
            } 
        } 
    }

return false; 
}
     检查Bindings信息。

VerifyWebSiteBindingsIsExist 
public static bool VerifyWebSiteBindingsIsExist(string bindingInfo) 

    string temp = string.Empty; 
    using (ServerManager mgr = new ServerManager()) 
    { 
        for (int i = 0; i < mgr.Sites.Count; i++) 
        { 
            foreach (Microsoft.Web.Administration.Binding b in mgr.Sites[i].Bindings) 
            { 
                temp = b.BindingInformation; 
                if (temp.IndexOf('*') < 0) 
                { 
                    temp = "*" + temp; 
                } 
                if (temp.Equals(bindingInfo)) 
                { 
                    return true; 
                } 
            } 
        } 
    }

return false; 
}
     以上代码均在Windows Vista SP1和Windows Server 2008上测试通过,使用时需要在工程中引用Microsoft.Web.Administration类库,该类库为IIS 7.0自带的。

C#管理IIS中的站点的更多相关文章

  1. 用《内网穿山甲》把本地IIS中的站点共享到远程访问

    前言: 因为各种原因,我们常常要把本机或局域网中搭建的站点发给远方的人访问,他有可能是测试人员.客户.前端.或领导演示,或是内部系统内部论坛临时需要在远程访问,事件变得很麻烦,要么有公网IP,要么能控 ...

  2. PowerShell管理IIS(新建站点、应用程序池、应用程序、虚拟目录等)

    #导入IIS管理模块 Import-Module WebAdministration #新建应用程序池 api.dd.com New-Item iis:\AppPools\api.dd.com Set ...

  3. django中的站点管理

    所谓网页开发是有趣的,管理界面是千篇一律的.所以就有了django自动管理界面来减少重复劳动. 一.激活管理界面 1.django.contrib包 django自带了很多优秀的附加组件,它们都存在于 ...

  4. HTML5游戏开发框架phaser学习日志(一)下载phaser,在IIS中配置phaser的examples站点

    phaser是HTML5开源的游戏引擎. 一.源码下载地址:https://github.com/photonstorm/phaser 二.文档结构: 三.将phaser-master部署到IIS中站 ...

  5. 从本机IIS中管理 远程服务器 IIS

    有时候,一般情况下,我们对服务器上 IIS 上的管理局限于 使用远程桌面:现在介绍一种,通过  本机 管理管理远程IIS 的方法! 1. 服务器端设置: 服务器管理器 ==>增加角色和功能向导= ...

  6. IIS中添加ftp站点

    1.创建Windows账号 右击点击“我的电脑”,选择“管理”打开服务器管理的控制台.展开“服务器管理器”,一路展开“配置”.“本地用户和组”,点“用户”项.然后在右边空白处点右键,选择“新用户”将打 ...

  7. IIS中配置WCF站点

    http://msdn.microsoft.com/zh-cn/library/aa751852.aspx http://blog.csdn.net/hsg77/article/details/389 ...

  8. 关于 IIS 中 Excel 访问的问题

    关于 IIS 上 Excel 文件的访问, 一路上困难重重, 最后按以下步骤进行设置, 可在 IIS 中正常使用! 1. 引用及代码: 1). 项目中添加 Excel 程序集引用(注意: 从系统 CO ...

  9. 【续集】在 IIS 中部署 ASP.NET 5 应用程序遭遇的问题

    dudu 的一篇博文:在 IIS 中部署 ASP.NET 5 应用程序遭遇的问题 针对 IIS 部署 ASP.NET 5 应用程序的问题,在上面博文中主要采用两种方式尝试: VS2015 的 Publ ...

随机推荐

  1. C#调用C++的DLL 数据类型转换

    /C++中的DLL函数原型为        //extern "C" __declspec(dllexport) bool 方法名一(const char* 变量名1, unsig ...

  2. oracle学习笔记(三)oracle函数

    --oracle 函数 --lower(char):将字符串转换为小写格式 --upper(char):将字符串转换为大写格式 --length(char):返回字符串的长度 --substr(cha ...

  3. 查看Sql语句执行速度

    原文链接:http://www.cnblogs.com/New-world/archive/2012/11/28/2793560.htmlMS_SQL模糊查询like和charindex的对比 lik ...

  4. bootstrap小结

    bootstrap总结 bootstrap总结 base css 我分为了几大类 1,列表 .unstyled(无样式列表),.dl-horizontal(dl列表水平排列) 2,代码 code(行级 ...

  5. javaWeb RSA加密使用

      加密算法在各个网站运用很平常,今天整理代码的时候看到了我们项目中运用了RSA加密,就了解了一下. 先简单说一下RSA加密算法原理,RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但 ...

  6. linux for循环

    一定要记得写后面的分号:http://www.runoob.com/linux/linux-shell-variable.html 这个页面的课程的循环教程是有问题的 for color in yel ...

  7. 关于jquery-easyUI中主键属性data-options的了解

    data-options是jQuery Easyui 最近两个版本才加上的一个特殊属性.通过这个属性,我们可以对easyui组件的实例化可以完全写入到html中,例如: <div class=& ...

  8. 使用div+iframe实现弹窗及弹出内容无法显示的解决

    使用div+iframe实现弹窗 除了使用实际的弹出窗口,还可以使用控制一个div的display属性来模拟一个弹出窗口的操作,这里使用在Div里放一个iFrame的方式,主要考虑到可以在需要的时候加 ...

  9. [LA] 3027 - Corporative Network [并查集]

    A very big corporation is developing its corporative network. In the beginning each of the N enterpr ...

  10. AnimateWindow

    WINDOWS提供了一个很有意思的函数:AnimateWindow.之前我想实现像MSN,QQ这些收到邮件的时候动画方式,从地下升上来的显示一个窗口,感觉很麻烦,自己去写代码,效果很不理想,今天无意中 ...