已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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服务进行编程控制.ISS版本的获取在进入客户环境前我们先检测下是否存在安装了ISS,以及ISS版本获取提示,目前获取ISS版本的方式主要有两种,第一种方法是通过遍历DirectoryEntry实体目录 第二种方式是通过获取注册表的ISS修改版本值经测试这种方式获取版本不稳定. 1: 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.PropertiesMajorIISVersionNumber.Value.ToString(); 12: MessageBox.Show(Version); 13: 14: catch (Exception se) 15: 16: /说明一点:IIS5.0中没有(int)entry.PropertiesMajorIISVersionNumber.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(softwaremicrosoftinetstp); 6: if (getkey != null) 7: 8: issversion= Convert.ToInt32(getkey.GetValue(majorversion, -1).ToString(); 9: MessageBox.Show(issversion.ToString(); 10: 11: return issversion; 12: 创建虚拟目录每个Internet服务可以从多个目录中发布,通过以通用命名约定 (UNC) 名、用户名及用于访问权限的密码指定目录,可将每个目录定位在本地驱动器或网络上,虚拟目录可以一个宿主程序,这可发布的操作目录即为虚拟目录.再来看看在ISS6.0中创建的虚拟目录的步骤和控制的属性.新建虚拟目录: 1: / 2: / 添加一个虚拟目录 3: / 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.PropertiesAnonymousPasswordSync0 = true; 21: newVirDir.PropertiesPath0 = logicDir;/+ virtualdirentryvirtualname; 22: 23: /设置的端口绑定数据 24: /_newVirDir.PropertiesServerBindings.Value =AppEntitys.WebAppInfor.HostIp+AppEntitys.WebAppInfor.HostProt+AppEntitys.WebAppInfor.AppDesc; 25: 26: /设置起始默认页: 27: newVirDir.PropertiesEnableDefaultDoc0 = true; 28: newVirDir.PropertiesDefaultDoc0 = Default.aspx; 29: 30: /_newVirDir 31: newVirDir.CommitChanges(); 32: 这个方法在创建时主要有两个参数 一个是新建虚拟目录名称 另外一个要部署Silverlight应用程序物理路径.在获取根节目录时需要制定ISS的路径. ISS的路径格式如:IIS:/ComputerName/Service/Website/Directory 找到根目录后添加新建虚拟目录. 制定参数为Schema-指每个结点的类型:IIsVirtualDir:虚拟目录 IIsWebDir :普通目录, 添加完成后调用ADSI中的AppCreate方法将目录真正创建.创建完成后通过根目录和新目录提交保存.目录属性设置在DirectoryEntity虚拟目录属性可以说是非常多的,当时在编程时我为了区分属性间区别做了一个方法去遍历整个属性集合PropertyCollection. 然后把常用重要的属性跳出来进入赋值设置. 因为关于虚拟目录的属性在MSDN上的API中并没有直接提到, 特别是对虚拟目录访问权限控制非常重要属性等 .先说明局部的常用的属性:例如修改程序起始页: 1: /设置起始默认页: 2: newVirDir.PropertiesEnableDefaultDoc0 = true; 3: newVirDir.PropertiesDefaultDoc0 = Default.aspx,Index.Html,index.asp; 4: newVirDir.CommitChanges();DefaultDoc选项可以支持多个但注意选择性排序.一般修改目录属性后都选通过CommitChanges()方法提交保存, 但有时你会发现我明明修改属性 却没有保存生效. 这是因为ISS中部分属性设置需要重新启动ISS服务才能生效.这个时候我们需要对ISS服务进行控制.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服务运行状态.应用程序池创建与控制ISS应用程序池是将一个或多个应用程序链接到一个或多个工作进程集合的配置。因为应用程序池中的应用程序与其他应用程序被工作进程边界分隔,所以某个应用程序池中的应用程序不会受到其他应用程序池中应用程序所产生的问题的影响, 当我们新建一个应用程序时 有时客户端环境我们无法清除预知, 为了尽量减少影响ISS设置外在因素, 我们把新建虚拟目录放到一个独立应用程序池中.当创建一个虚拟目录后,也同时创建一个程序池 把虚拟目录放到其中: 1: / 2: / 建立程序池后关联相应应用程序及虚拟目录 3: / 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.PropertiesAppPoolId.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.PropertiesWAMUserName0 = Username; 22: newpool.PropertiesWAMUserPass0 = Password; 23: newpool.PropertiesAppPoolIdentityType0 = 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:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年碳汇计量核查协议
- 2025年水果连锁门店加盟经营协议
- 银川第二中学2025-2026学年高二生物第一学期期末达标检测模拟试题含解析
- 上海市虹口中学2026届数学高一第一学期期末达标测试试题含解析
- 陕西省南郑中学2026届高一上化学期中复习检测模拟试题含解析
- 重庆铜梁县第一中学2026届高一化学第一学期期中质量跟踪监视模拟试题含解析
- 上海市长征中学2026届物理高一第一学期期末复习检测模拟试题含解析
- 公司车辆通行费收费员岗位现场作业技术规程
- 小区居民交往协议书
- 布展大纲委托协议书
- 2025年教育信息化数字化校园管理系统建设实施方案
- 挂篮施工安全管理课件
- 老年认知障碍患者精神药物不良反应方案
- GB/T 6540-2025石油产品颜色的测定
- 吉林开放大学2025年《中华民族共同体概论》形成性考核1-3综合考核答案
- 未来大学四年的规划
- 2025上半年事业单位联考《职业能力倾向测验》A类考试测试题(+答案)
- 2023-2024在线学习课堂网课《智能社会中的知识产权法(西北工业大)》单元测试考核答案
- 叠合钢网建房施工方案
- “人才计划”2025年新能源汽车行业人才需求及培养可行性报告
- 企业保安安全知识培训课件
评论
0/150
提交评论