45fan.com - 路饭网

搜索: 您的位置主页 > 网络频道 > 阅读资讯:Asp.net网站的ClickOnce自动部署的详细介绍

Asp.net网站的ClickOnce自动部署的详细介绍

2016-09-01 15:32:47 来源:www.45fan.com 【

Asp.net网站的ClickOnce自动部署的详细介绍

Asp.net网站的ClickOnce自动部署

前段时间对asp.net网站的自动部署比较感兴趣,自己研究了一阵子,终于有小成。总结了一下,我打算写一系列关于Asp.net网站自动部署的文章,主要内容包括:

1、Web虚拟目录的配置

2、SqlServer数据库的配置

3、配置文件的修改和加密

4、WindowsNT用户和Active Directory用户的配置

有必要说明的是,对于简单的Web的自动部署可以使用.Net自带的Web安装项目来做自动部署程序,只需要创建自己的System.Configuration.Installer的派生类就可以了,这方面的文章可以看看MSDN的Deployment Workthrough,里面介绍了包括一些简单WinForm、WebForm和数据库自动部署的方法。

但是对于复杂的工程(像电子政务平台这样的有多个Solution项目构成,并且在部署的时候需要进行很多的配置工作)来说不适用了,除了方便拷贝文件以外没有其他的便利了。有兴趣的看官可以自己去试一下,看看如何用.Net自带的WebSetup来制作满足一下需求的自动部署安装包:

1)该应用系统由多个Solution组成,并且每个Solution中可能有多个UI。

2)每个UI下都有很多未包含进工程的文件,如图片、帮助文档、配置文件等

3)最后打包成一个安装包

相信我,极其痛苦。听说vs2005里面增加了clickonce的自动部署功能,没有接触过,如果有了解的看官,请不吝赐教,wkai_chen(这是@)hnair.com。

第一步先讲虚拟目录的配置,虚拟目录的配置简单来说就是创建虚拟目录。用手工的方式实现非常简单,直接设定“Web sharing”就可以了,让我们看看怎么通过编程的方式实现,本文将介绍两种创建虚拟目录的方法:

1、通过调用iisvdir.vbs,

2、通过System.DirectoryServices.DirectoryEntry。

如果看官有其他的方法,欢迎讨论chwkai@gmail.com。

为了方便描述,我写了两个虚拟目录操作类,简单的封装了iisvdir.vbs和System.DirectoryServices.DirectoryEntry管理虚拟目录的方法,结构如下所示:

Asp.net网站的ClickOnce自动部署的详细介绍

Server为iis服务器的ip或机器名,User和Password为该服务器的管理员用户名和密码,Alias为虚拟目录的名称,VirtualRoot为虚拟目录所在根目录的名称(如下图),PhysicalPath为该虚拟目录相应的物理路径。如果想进一步了解IIS虚拟目录的属性,可以参考MSDNIIsWebVirtualDir

Asp.net网站的ClickOnce自动部署的详细介绍

 


 

通过调用iisvdir.vbs创建虚拟目录

看官可以参考一下MSDN的相关资料:

Creating Web Virtual Directories Using Iisvdir.vbs

Deleting Web Virtual Directories Using Iisvdir.vbs

Listing Web Virtual Directories Using Iisvdir.vbs .

仔细看还会发现, IIS管理器也是通过调用iisvdir.vbs来实现虚拟目录的创建和删除的。我们可以通过命令行的方式来执行iisvdir.vbs脚本,

1)创建虚拟目录:

Asp.net网站的ClickOnce自动部署的详细介绍cscriptc:/windows/system32/iisvdir.vbs[/sserver][/uusername/ppassword]/create [virtualRoot]AliasPhysicalPath

2)删除虚拟目录:

1Asp.net网站的ClickOnce自动部署的详细介绍cscriptc:/windows/system32/iisvdir.vbs[/sserver][/uusername/ppassword]/delete[virtualRoot]/Alias

3)查看指定虚拟目录下的全部子目录:

1Asp.net网站的ClickOnce自动部署的详细介绍cscriptc:/windows/system32/iisvdir.vbs[/sserver][/uusername/ppassword]/queryvirtualRoot

通过封装这三个操作,可以实现iis虚拟目录的创建、删除和判断是否存在:

1)创建虚拟目录:

1///<summary>

2///创建iis虚拟目录

3///</summary>

4///<exceptioncref="CreateIIsDirectory.DirectoryException">虚拟目录操作异常</exception>

5publicoverridevoidCreateDirectory()

6{

7//已不覆盖的方式创建虚拟目录,当虚拟目录存在时抛出异常

8this.CreateDirectory(false);

9}

10

11///<summary>

12///创建iis虚拟目录

13///</summary>

14///<paramname="bReplace">是否覆盖掉原有的虚拟目录</param>

15///<exceptioncref="CreateIIsDirectory.DirectoryException">虚拟目录操作异常</exception>

16publicoverridevoidCreateDirectory(boolbReplace)

17{

18//判断目录是否存在

19if(this.Exist())

20{

21if(bReplace)

22{

23//若允许覆盖则先删除原有的虚拟目录

24this.DeleteDirectory();

25}

26else

27{

28//若不允许覆盖直接抛出目录已存在的异常

29DirectoryException.Throw("directoryalreadyexist");

30}

31}

32

33ReturnMessagemessage=ScriptDirectory.ExecuteScript(

34this,ScriptDirectory.CONST_ACTION_CREATE);

35

36//输出message信息供nunit查看

37Console.WriteLine("returncode:"+message.Code);

38Console.WriteLine("returnmessage:/n"+message.Message);

39

40//若创建失败抛出虚拟目录操作异常

41if(message.Code!=0)

42{

43DirectoryException.Throw(message.Message);

44}

45}

2)删除虚拟目录:

1///<summary>

2///删除iis虚拟目录

3///</summary>

4///<exceptioncref="CreateIIsDirectory.DirectoryException">虚拟目录操作异常</exception>

5publicoverridevoidDeleteDirectory()

6{

7ReturnMessagemessage=ScriptDirectory.ExecuteScript(

8this,ScriptDirectory.CONST_ACTION_DELETE);

9

10//输出message信息供nunit查看

11Console.WriteLine("returncode:"+message.Code);

12Console.WriteLine("returnmessage:/n"+message.Message);

13

14//若删除失败抛出虚拟目录操作异常

15if(message.Code!=0)

16{

17DirectoryException.Throw(message.Message);

18}

19}

 

3) 判断虚拟目录是否存在:

 

1///<summary>

2///判断iis虚拟目录是否存在

3///</summary>

4///<returns>目录是否存在</returns>

5publicoverrideboolExist()

6{

7ReturnMessagemessage=ScriptDirectory.ExecuteScript(

8this,ScriptDirectory.CONST_ACTION_QUERY);

9boolbExist=false;

10

11//输出message信息供nunit查看

12Console.WriteLine("returncode:"+message.Code);

13Console.WriteLine("returnmessage:/n"+message.Message);

14

15//从返回字符串中判断该虚拟目录是否存在

16if(message.Code==0)

17{

18Regexreg=newRegex("/"+this.m_strAlias+@"/s+");

19message.Message=message.Message.Substring(

20message.Message.IndexOf("/"));

21

22bExist=reg.IsMatch(message.Message);

23}

24

25returnbExist;

26}

ScriptDirectory.ExecuteScript函数封装了iisvdir.vbs的调用和参数的组合,代码比较长,大家可以在/Files/chwkai/CreateIIsDirectory.rar下载到本文所讨论的代码。

orz,明天还有场球赛,睡觉了。下次的文章将继续写到,如何用System.DirectoryServices.DirectoryEntry来创建IIS虚拟目录,相对于iisvdir.vbs,这种方式更加灵活,并且具有更多的功能,如设定虚拟目录属性等。

在上一篇的Asp.net网站的ClickOnce自动部署(2)-虚拟目录的配置 里面,我介绍了如何通过封装iisvdir.vbs的调用来实现iis虚拟目录的配置,今天继续介绍如何使用System.DirectoryServices.DirectoryEntry来实现iis虚拟目录的管理,供初学者参考。相对于调用iisvdir.vbs的脚本,后者可以设定虚拟目录的更多属性,如身份验证方式、默认文档等,还可以进行更有力的异常处理。IIS虚拟目录的属性可以参考MSDNIIsWebVirtualDir

主要内容:

1、介绍System.DirectoryServices.DirectoryEntry

2、如何使用DirectoryEntry来进行虚拟目录的管理

本文相关代码可以从/Files/chwkai/CreateIIsDirectory.rar下载。

 

 


 

 

介绍System.DirectoryServices.DirectoryEntry

虽然在MSDN中的说法是"封装 Active Directory 层次结构中的节点或对象",但是通过DirectoryEntry,我们可以连接ActiveDirectory服务器来获取AD上的信息,用来连接WindowNT服务器来管理服务器上的用户,甚至还可以用来管理IIS。

1)连接ActiveDirectory服务器:

//获取AD服务器foo.com的连接

DirectoryEntryentry=newDirectoryEntry("LDAP://foo.com/DC=foo,DC=com",user,password);

2)连接WinNT服务器:

//获取NT服务器foo的连接

DirecotryEntryentry=newDirectoryEntry("WinNT://foo",user,password);

3)连接IIS服务器

获取本机的“默认网站”的节点对象:

1//获取本机的“默认网站”的节点对象

2DirectoryEntryentry=newDirectoryEntry("IIS://localhost/w3svc/1/ROOT");

获取服务器foo上的“默认网站”的节点对象:

DirectoryEntryentry=newDirectoryEntry("IIS://foo/w3svc/1/ROOT",user,password);

通过DirectoryEntry,我们可以很方便的管理这些服务器上的节点。

 

 


 

如何使用DirectoryEntry来实现IIS虚拟目录的管理

1、创建虚拟目录:

创建虚拟目录的经过以下步骤:

1)获取该虚拟目录的上级目录的DirectoryEntry对象rootEntry;

2)通过rootEntry的DirectoryEntry::Childrens.Add来添加该虚拟目录;

//创建虚拟目录

DirectoryEntryentry=rootEntry.Children.Add(this.m_strAlias,"IIsWebVirtualDir");

3)更新该虚拟目录的属性,如更新身份验证模式,访问权限和所对应的物理目录等。需要注意的是,使用DirectoryEntry来创建虚拟目录,只能在该虚拟目录建立了以后,才能设置物理目录等属性。

创建虚拟目录的代码如下:

1///<summary>

2///创建iis虚拟目录

3///</summary>

4///<exceptioncref="CreateIIsDirectory.DirectoryException">虚拟目录操作异常</exception>

5publicoverridevoidCreateDirectory()

6{

7//已不覆盖的方式创建虚拟目录,当虚拟目录存在时抛出异常

8this.CreateDirectory(false);

9}

10

11///<summary>

12///创建iis虚拟目录

13///</summary>

14///<paramname="bReplace">是否覆盖掉原有的虚拟目录</param>

15///<exceptioncref="CreateIIsDirectory.DirectoryException">虚拟目录操作异常</exception>

16publicoverridevoidCreateDirectory(boolbReplace)

17{

18//判断目录是否存在

19if(this.Exist())

20{

21if(bReplace)

22{

23//若允许覆盖则先删除原有的虚拟目录

24this.DeleteDirectory();

25}

26else

27{

28//若不允许覆盖直接抛出目录已存在的异常

29DirectoryException.Throw("directoryalreadyexist");

30}

31}

32

33try

34{

35//获取上级目录的DirectoryEntry对象

36DirectoryEntryrootEntry=SystemDirectory.GetParentEntry(this);

37//创建虚拟目录

38DirectoryEntryentry=rootEntry.Children.Add(this.m_strAlias,"IIsWebVirtualDir");

39entry.Invoke("AppCreate",true);

40entry.CommitChanges();

41rootEntry.CommitChanges();

42

43//更新虚拟目录属性

44SystemDirectory.UpdateEntry(entry,this.Property);

45}

46catch(System.Exceptionex)

47{

48DirectoryException.Throw(ex.Message);

49}

50}

DirectoryEntry的commitChanges方法用于提交DirectoryEntry的操作。line41中的提交了以后,该虚拟目录才能建立,然后在进行更新虚拟目录的属性的操作。若没有commitChanges就进行更新操作,会抛出找不到虚拟目录的异常,有兴趣的朋友可以试试。

2、删除虚拟目录:

删除虚拟目录比较简单,只需调用虚拟目录的父节点的DirectoryEntry对象的Delete操作就可以了,需要注意的是Delete对象需要两个参数:子节点的Alias和子节点的类型(虚拟目录节点的类型为IIsWebVirtualDir)。

1///<summary>

2///删除iis虚拟目录

3///</summary>

4///<exceptioncref="CreateIIsDirectory.DirectoryException">虚拟目录操作异常</exception>

5publicoverridevoidDeleteDirectory()

6{

7//判断目录是否存在

8if(!this.Exist())

9{

10//若待删除的虚拟目录不存在,则抛出异常

11DirectoryException.

本文地址:http://www.45fan.com/a/question/70802.html
Tags: ASP.NET 站的 ClickOnce
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部