A:版本题目
这是你在举行编程前必须要要斟酌的一个现实题目.由于IIS版本差别对应编程上基本上完全差别体式格局来举行的.先相识一下Iss版本在操纵体系个具体要求.
ISS6.0时期主要以using System.DirectoryServices空间下的DirectoryEntry 对象作为编程接见一个主要载体.但随着ISS7.0宣布.NET的Web顺序由ISS6.0最先逐步过渡到 7.0版本.而且在编程掌握ISS上新增加的Microsoft.Web.Administration称号空间, 提出多个用于治理 操纵 和接见ISS的对象, 使操纵ISS的编程越发简约 高效.
B:我们要做什么
现实用户操纵环境中主要以Windows XP/2000/2003操纵体系为主, 这就致使了ISS版本主要在5.0/5.1/6.0之间,所以本次演示的代码编程实例都是ISS7.0版本以下(不包括Iss7.0).
为了到达演示目标,我们如今需求是如许的: 把硬盘上Silverlight运用顺序胜利布置到当地机械ISS上. 并支撑经由历程局域网接见. 需求很简朴吧就是一句话, 实在当进入现实编程时由于客户的局域网环境是不可预知的, 这也就致使影响布置Silverlight顺序到ISS上诸多未知要素. 所以要在编程中使Silverlight运用顺序布置胜利,我们必需运用编程除了掌握ISS外还要掌握其他主要影响ISS要素.
C:进入编程
既然提出需求我们也许肯定一下处置惩罚思绪:
在默许站点下竖立一个虚拟目次承载Silverlight 运用顺序, 新建的虚拟目次运转在自力运用顺序池中, 支撑当地局域网匿名接见实在就是对接见权限掌握, 为了直接使变动的运用见效须要屡次重新启动ISS的效劳, 这就须要对ISS效劳举行编程掌握.
<1>ISS版本的猎取
在进入客户环境前我们先检测下是不是存在安装了ISS,以及ISS版本猎取提醒,现在猎取ISS版本的体式格局主要有两种,第一种要领是经由历程遍历DirectoryEntry实体目次 第二种体式格局是经由历程猎取注册表的ISS修正版本值[经测试这类体式格局猎取版本不稳定].
public static void GetIssVersionByDri(string domainname) 2: { 3: try 4: { 5: if (string.IsNullOrEmpty(domainname)) 6: { 7: //假如为空 则默许为当地机械 8: domainname = "LOCALHOST"; 9: } 10: DirectoryEntry getEntity=new DirectoryEntry("IIS://" + domainname + "/W3SVC/INFO"); 11: string Version=getEntity.Properties["MajorIISVersionNumber"].Value.ToString(); 12: MessageBox.Show(Version); 13: } 14: catch (Exception se) 15: { 16: //申明一点:IIS5.0中没有(int)entry.Properties["MajorIISVersionNumber"].Value;属性,将抛出异常 证实版本为 5.0 17: MessageBox.Show("猎取ISS的版本是发作异常信息:"+se.Message); 18: } 19: }
经由历程体系注册表猎取ISS版本的值:[测试发明不稳定]
1: public static string GetIssVersion() 2: { 3: //RegistryKey示意 Windows 注册表中的项级节点.此类是注册表封装 4: string issversion = string.Empty; 5: RegistryKey getkey = Registry.LocalMachine.OpenSubKey("software\\microsoft\\inetstp"); 6: if (getkey != null) 7: { 8: issversion= Convert.ToInt32(getkey.GetValue("majorversion", -1)).ToString(); 9: MessageBox.Show(issversion.ToString()); 10: } 11: return issversion; 12: }
<2>竖立虚拟目次
每一个Internet效劳可以从多个目次中宣布,经由历程以通用定名商定 (UNC) 名、用户名及用于接见权限的暗码指定目次,可将每一个目次定位在当地驱动器或收集上,虚拟目次可以一个宿主顺序,这可宣布的操纵目次即为虚拟目次.再来看看在ISS6.0中竖立的虚拟目次的步骤和掌握的属性.
新建虚拟目次:
1: /// <summary> 2: /// 增加一个虚拟目次 3: /// </summary> 4: public void CreateVirtualDir(string virtualdirname, string logicDir) 5: { 6: //假如存在反复 就直接删除虚拟目次 7: if (IsExitesVirtualDir(virtualdirname)) 8: DeleteVirtualDir(virtualdirname); 9: 10: DirectoryEntry rootEntry; 11: rootEntry = new DirectoryEntry("IIS://localhost/W3SVC/1/root"); 12: 13: DirectoryEntry newVirDir; 14: newVirDir = rootEntry.Children.Add(virtualdirname, "IIsWebVirtualDir"); 15: newVirDir.Invoke("AppCreate", true); 16: 17: newVirDir.CommitChanges(); 18: rootEntry.CommitChanges(); 19: 20: newVirDir.Properties["AnonymousPasswordSync"][0] = true; 21: newVirDir.Properties["Path"][0] = logicDir;//+ @"virtualdirentry\virtualname\"; 22: 23: //设置的端口绑定数据 24: //_newVirDir.Properties["ServerBindings"].Value =AppEntitys.WebAppInfor.HostIp+AppEntitys.WebAppInfor.HostProt+AppEntitys.WebAppInfor.AppDesc; 25: 26: //设置肇端默许页: 27: newVirDir.Properties["EnableDefaultDoc"][0] = true; 28: newVirDir.Properties["DefaultDoc"][0] = "Default.aspx"; 29: 30: //_newVirDir 31: newVirDir.CommitChanges(); 32: }
这个要领在竖立时主要有两个参数 一个是新建虚拟目次称号 别的一个要布置Silverlight运用顺序物理途径.在猎取根节目次时须要制订ISS的途径. ISS的途径花样如:IIS://ComputerName/Service/Website/Directory
找到根目次后增加新建虚拟目次. 制订参数为Schema-指每一个结点的范例:IIsVirtualDir:——虚拟目次 IIsWebDir :——平常目次, 增加完成后挪用ADSI中的"AppCreate"要领将目次真正竖立.竖立完成后经由历程根目次和新目次提交保留.
<3>目次属性设置
在DirectoryEntity虚拟目次属性可以说是异常多的,当时在编程时我为了辨别属性间区分做了一个要领去遍历全部属性鸠合PropertyCollection. 然后把经常运用主要的属性跳出来进入赋值设置. 由于关于虚拟目次的属性在MSDN上的API中并没有直接提到, 特别是对虚拟目次接见权限掌握异常主要属性等 .先申明部份的经常运用的属性:
比方修正顺序肇端页:
1: //设置肇端默许页: 2: newVirDir.Properties["EnableDefaultDoc"][0] = true; 3: newVirDir.Properties["DefaultDoc"][0] = "Default.aspx,Index.Html,index.asp"; 4: newVirDir.CommitChanges();
DefaultDoc选项可以支撑多个但注重挑选性排序.平常修正目次属性后都选经由历程CommitChanges()要领提交保留, 但偶然你会发明我明显修正属性 却没有保留见效. 这是由于ISS中部份属性设置须要重新启动ISS效劳才见效.这个时刻我们须要对ISS效劳举行掌握.
<4>ISS效劳掌握
关于ISS效劳掌握微软供应一个定名空间System.ServiceProcess 供应可以疾速操纵当地体系效劳API.关于ISS效劳掌握我们最经常运用的是重新启动使当前设置见效. 在设置效劳时我先找到效劳称号,翻开计算机治理 在效劳和运用顺序目次下翻开效劳.
我们能看到ISS效劳定名是:ISSAdmin 我们经由历程编码来掌握:启动ISS.
1: //猎取IIS Serivcer掌握声明 . 参数为Server在体系标识该效劳的简称,. 2: ServiceController getservicecon = new ServiceController("IISADMIN"); 3: getservicecon.Start();
重启/停息/住手ISS效劳:
1: if (getservicecon.Status == ServiceControllerStatus.Running) 2: { 3: //住手效劳 4: getservicecon.Stop(); 5: //停息效劳 6: getservicecon.Pause(); 7: //重启效劳 8: //Process供应对当地和长途历程的接见并使您可以启动和住手当地体系历程 9: //运用Start要领挪用:启动(或重用)此 Process 组件的 StartInfo 属性指定的历程资本,并将其与该组件关联 10: //假如启动了历程资本,则为 true;假如没有启动新的历程资本(比方,假如重用了现有历程),则为 false 11: //经由历程指定文档或运用顺序文件的称号来启动历程资本,并将资本与新的 Process 组件关联 12: Process.Start("iisreset"); 13: }
如上就是简朴运用编程有用掌握ISS效劳运转状况.
<5>运用顺序池竖立与掌握
ISS运用顺序池是将一个或多个运用顺序链接到一个或多个事情历程鸠合的设置。由于运用顺序池中的运用顺序与其他运用顺序被事情历程边境分开,所以某个运用顺序池中的运用顺序不会遭到其他运用顺序池中运用顺序所发生的题目标影响, 当我们新建一个运用顺序时 偶然客户端环境我们没法消灭预知, 为了只管削减影响ISS设置外在要素, 我们把新建虚拟目次放到一个自力运用顺序池中.
当竖立一个虚拟目次后,也同时竖立一个顺序池 把虚拟目次放到个中:
1: /// <summary> 2: /// 竖立顺序池后关联响应运用顺序及虚拟目次 3: /// </summary> 4: public static void SetAppToPool(string appname) 5: { 6: //猎取目次 7: DirectoryEntry getdir = new DirectoryEntry("IIS://localhost/W3SVC"); 8: foreach (DirectoryEntry getentity in getdir.Children) 9: { 10: if (getentity.SchemaClassName.Equals("IIsWebServer")) 11: { 12: //设置运用顺序顺序池 先取得运用顺序 在设定运用顺序顺序池 13: //第一次测试根目次 14: foreach (DirectoryEntry getchild in getentity.Children) 15: { 16: if (getchild.SchemaClassName.Equals("IIsWebVirtualDir")) 17: { 18: //找到指定的虚拟目次. 19: foreach (DirectoryEntry getsite in getchild.Children) 20: { 21: if (getsite.Name.Equals(appname)) 22: { 23: //【测试胜利经由历程】 24: getsite.Properties["AppPoolId"].Value = appname; 25: getsite.CommitChanges(); 26: } 27: } 28: } 29: } 30: } 31: } 32: }
思绪以下: 起首取得ISS的根目次即ISS://localhost/W3SVC. 猎取胜利后经由历程SchemaClassName猎取节点范例.ISSWebServer平常目次 ISSWebVirturalDir虚拟目次. 经由历程虚拟目次的Name唯一称号猎取指定虚拟目次, 在经由历程属性参数AppPoolId设置隶属的运用顺序池的称号. 然后提交保留.
实在经由历程运用我们可以清楚看到ISS中各个目次之间的关联关联.上面是修正一个已存储在运用顺序池,怎样竖立:
1: public static bool CreateAppPool(string metabasePath, string appPoolName, string Username, string Password) 2: { 3: bool issucess = false; 4: try 5: { 6: if (metabasePath.EndsWith("/W3SVC/AppPools")) 7: { 8: if (MyIISHelper.AppPoolExist(appPoolName)) 9: { 10: //已存在 先删除这个AppPool 在竖立 11: //MessageBox.Show("当前以站点称号定名的顺序池已存在!"); 12: DeleteRepPool(appPoolName); 13: } 14: 15: //竖立一个新顺序池 16: DirectoryEntry newpool; 17: DirectoryEntry apppools = new DirectoryEntry(metabasePath); 18: newpool = apppools.Children.Add(appPoolName, "IIsApplicationPool"); 19: 20: //设置属性 接见用户名和暗码 平常采用默许体式格局 21: newpool.Properties["WAMUserName"][0] = Username; 22: newpool.Properties["WAMUserPass"][0] = Password; 23: newpool.Properties["AppPoolIdentityType"][0] = "3"; 24: newpool.CommitChanges(); 25: } 26: return issucess; 27: } 28: catch// (Exception ex) 29: { 30: return false; 31: } 32: }
基本上和竖立一个DirectoryEntity相同但注重指定的Schome范例是IIsApplicationPool用来标识竖立的是一个运用顺序池.固然竖立可以删除 删除体式格局以下:
1: DirectoryEntry appPool = new DirectoryEntry("IIS://localhost/W3SVC/AppPools"); 2: foreach (DirectoryEntry getdir in appPool.Children) 3: { 4: if (getdir.Name.Equals(appname)) 5: { 6: getdir.DeleteTree();//删除 7: } 8: }
关于运用顺序池假如不做任何设置则在ISS中会被DefaultPool中增加, 但偶然默许顺序池设置环境不一定可以满足当前顺序需求,比方最常见的关于.NET版本的掌握. 个中对3.0和3.5版本运用设置须要重新注册3.5 .NET FrameWork.部份组件这就涉及到一个.NET版本题目.
<6>.NET版本题目
在举行ISS掌握中固然也是碰到林林总总的题目, 一方面由于测试XP 2003体系环境差别, 须要掌握要素过量,固然个中值得一提就是关于全部运用顺序池的.NET版本题目.我们先来看看多版本下ISS中设置:
假如我们的运用顺序运用3.0或3.5版本 则在运用顺序池的没有对应的.NET版本.这时候运用顺序运转会提醒一个Http毛病404.17 notFound:
实在ISS在处置惩罚运用顺序池于.NET版本举行映照时,Net3.0\3.5没带处置惩罚顺序aspnet_isapi.dll,所以IIS中指定网站实用框架时,这也是为何我们在ISS映照时看不到.Net3.0\3.5版本. 最直接的要领重新注册.NET 3.5 由.NET 2.0版本托管: 这时候我们须要实行一个Cmd敕令:
重新把运用顺序池.net版本切换成.net 2.0.一样完成.net 3.0/3.5托管.
<7>运用环境以及测试前提
如上运用顺序和代码均在Windows 7./XP2/Windows Server 2003上经由历程. 对应的ISS版本局限从ISS5.0/5.1到Iss 6.0/7.0. 包括ISS7.0. 篇幅有限,现实中关于ISS的操纵另有许多细节题目不能四平八稳,我只是挑了个中我以为基本或几位主要几个题目偏重来写, 现实中关于ISS另有其他诸多要素, 所以关于这方面掌握编程 只能折衷的有目标性挑选自身想做的结果. 切不可贪大求全. 由于这自身掌握历程就是庞杂的历程. 客户环境也不能诸如一致.
以上就是细致引见C#操纵IIS完全剖析(图文)的细致内容,更多请关注ki4网别的相干文章!