在IIS6,7中部署ASP.NET网站

查看web.config文件

ASP.NET网站与通常的桌面程序不一样,不是拷贝过来就能运行的(数据库链接除外)。 要想运行它,一般须要一些配置过程。
可是,咱们到底须要配置什么呢?
答案是:查看web.confightml

web.config一般会放在网站的根目录,这个文件中包含了一最重要的网站运行参数。好比: connectionStrings,httpHandlers,httpModules ,这些参数都是网站开发人员认为运行网站所必需的参数。 所以,若是咱们想将一个网站部署到IIS中,必须首先打开web.config文件,逐个确认这些重要的参数是否符合要求。web

这里要补充一点的是:有些开发人员喜欢将各种参数放在appSettings配置节中,即使是数据库的链接字符串也放在appSettings中。 我只能说:这是个很很差的习惯。所以,在部署这类网站时,可能还要注意一下appSettings是否包含数据库的链接字符串, 这就须要人工识别了。固然了,appSettings中还可能包含一些重要目录配置,一样,也只能人工识别了。正则表达式

今天要讲述的参数主要涉及到IIS和SQL SERVER,所以本文将会分开介绍它们。
并且IIS还会分为6和7.5二个版原本单独演示。
SQL SERVER则以 2005 Express版原本演示。
我演示所用的操做系统为:Windows Server 2003和Windows 7 ,它们分别附带了IIS 6和IIS 7.5sql

说明:一般咱们在部署网站时,都应该先根据web.config定义的那些重要参数来配置网站。 但为了让您能对这些参数有较深入的印象,下面的演示中,不是先根据web.config来配置网站, 而是采用【从建立一个站点后,一步一步地发现问题并解决】的方式来说解这个过程。数据库

在IIS中建立网站

每一个ASP.NET程序都是一个网站,要想运行它们,都须要在IIS中部署它们, 部署的第一步就是要在IIS建立一个网站。 在IIS中建立网站的过程比较简单,由于IIS都提供向导界面来帮助咱们完成这个配置过程, 所以,本文打算省略那些无心义的贴图。express

说明,咱们先从IIS6开始。 这里只要求您在IIS中建立一个网站,把它配置成网站就能够了,其它的配置咱们后面再谈。
示例项目:点击此处进入 MyMVC DEMO 下载页面浏览器

网站建立好了吗?我停下来等一下吧。安全

 

个人网站配置好了,如今已经能够用浏览器访问它。服务器

如今咱们能够切换风格来试试效果,点击页面右上角的【3】试试看。mvc

噢,怎么一开始就出错了:

看到这个提示,不要茫然。为了界面友好,我用JavaScript捕获了这个错误,但如今咱们须要知道错误的缘由是什么,怎么办呢?

有FireBug或者Fiddler2吗?
若是有,就打开它们吧。下图是我用FireBug看到的错误缘由(须要从新执行刚才的操做):

从FireBug中,咱们能够看到,刚才的操做触发了一次请求,请求的地址是:/AjaxStyle/SetStyle.cspx
cspx是个什么扩展名呢?仍是打开web.config看一下吧。

<httpHandlers>
    <add path="*.cspx" verb="*" type="MyMVC.AjaxHandlerFactory, MyMVC" validate="true" />
    <add path="*.aspx" verb="*" type="MyMVC.MvcPageHandlerFactory, MyMVC" validate="true" />
    <add path="/mvc/*" verb="*" type="MyMVC.MvcPageHandlerFactory, MyMVC" validate="true" />
</httpHandlers>

在web.config中,网站要求配置的一些httpHandlers中,第一个即是针对【cspx】扩展名的。

这里我要解释一下【cspx】这个扩展名了。在之前的示例中,我选择了【cs】这个扩展名表示一个AJAX调用, 可是,后来发现不少人在IIS中部署中遇到问题了(缘由后面再说)。因而,此次我换了个扩展名。 然而,又有人问我:cspx, 是否是写错了? 或许他认为应该是【aspx】才对。

这个问题我用邮件回答过屡次了,今天用博客的形式再回答一次:
取什么扩展名都不重要,我只要选择没有用过的扩展名来区分是AJAX调用就能够了。 我也能够取【fish】来作为AJAX请求地址的扩展名,只是担忧一些人认为俗气而已。

IIS6 添加扩展名映射

回到IIS,在网站节点上,右击,从弹出的菜单中,选择【属性】,而后在弹出的对话框中,选择【主目录】选项卡,并点击【配置】按钮。 此时的界面应该是这样的:

找到【ascx】这个扩展名,双击它,是否是弹出下面这个对话框?

照着图片的操做去完成:复制【可执行文件】的设置路径。而后点击【取消】关闭对话框。

此时将回到【应用程序配置】对话框,点击【添加...】按钮,

照着图片操做吧。对话框中的【可执行文件】的参数,此时已在Windows剪切板中,如今只要粘贴就能够了。

所有【肯定】,关闭全部对话框,再回到浏览器,而后再试一次。

如今能够操做了吧?

 

 

先不要点击其它连接,仍是来对刚才的操做作个小结吧。

在ASP.NET中,有时候咱们可能会须要建立本身所需的HttpHandler来处理一些特殊的请求。
个人MyMVC框架就有这个需求:将AJAX请求与页面的请求分开来处理。
因此咱们须要一些特殊格式的URL。一般选择一个没用过的扩展名会比较方便,所以我选择了 cspx
为了能告诉ASP.NET将如下格式的ULR映射到AjaxHandlerFactory

/Fish.AA.AjaxTest/Add.cspx
/Fish.BB.AjaxTest.Add.cspx
/Fish/BB/AjaxTest/Add.cspx
/AjaxDemo/GetMd5.cspx
/AjaxDemo.GetMd5.cspx

我就须要在web.config中注册这种URL模式,而且为了能最好的匹配这些URL,我可使用下面的配置:

<httpHandlers>
    <add path="*Ajax*/*.cspx,*Ajax*.*.cspx" verb="*" 
                                type="MyMVC.AjaxHandlerFactory, MyMVC" validate="true"/>
</httpHandlers>

咱们能够用Visual Studio自带的WebDev.WebServer.EXE来运行网站程序。
原本,这一切都是很完美的。
但是,IIS中并不支持这么复杂的path设置,它只能支持简单的扩展名映射。
因此,我也只好使用简单的扩展名:【.cspx】来向IIS注册。

我再来解释一下,为何在ASP.NET中,前面那个path可以识别我上面所说的5种格式的URL?
在ASP.NET管线的处理器映射阶段,ASP.NET会将【*Ajax*/*.cspx,*Ajax*.*.cspx】转换成下面的正则表达式, 再来检查每一个请求的URL是否匹配。

(?:\A|(?<=/))[^/]*Ajax[^/]*/[^/]*\.cspx\z|(?:\A|(?<=/))[^/]*Ajax[^/]*\.[^/]*\.cspx\z

有兴趣的话,您也能够检验一下,这个正则表达式与前面的URL都能匹配。
从这里也能够看出ASP.NET对处理器的映射实现,是能够支持比较复杂的URL模式的。
关于处理器的映射过程能够参考个人博客【细说 HttpHandler 的映射过程】

前面解释了我为何最终选择【.cspx】来向IIS注册处理器了。
在注册时,还有二个参数也比较重要:
1. 可执行文件:其实就是一个实现了ISAPI的模块,IIS会将匹配的请求交给它,而后由它再交给ASP.NET。 这个参数的路径比较长,咱们根本不须要记住它,只须要找个已有配置中,将它COPY出来就能够了。
2. 确认文件是否存在:这个参数必定不要选择。由于咱们请求的URL并无对应的文件存在。

这里要补充一点:
我之前发布的FishWebLib DEMO中, 使用了【cc】这样的扩展名,能够按照上面的方法注册。
但我还使用了【cs】和【ascx】这二个扩展名。因为这二个扩展名的注册已经存在了, 因此,我须要修改它们的配置:双击配置项,确保不要勾选【确认文件是否存在】便可。

IIS6 无扩展名的映射

让咱们再回到前面已配置好的示例中,此时页面的显示应该是这个样子的:

点击一下页面上的连接【/mvc/Customers】试试。

不要觉得我是在故意设置陷阱哦。我在设计示例程序时,根本也没想到会这样。

到这里,可能有人会想,在httpHandlers中不是还有个【path="/mvc/*"】没有配置吗?
继续按照前面的方法去配置就能解决问题了。

好吧,我再照着前面的方法再试着注册【path="/mvc/*"】试试,结果以下:

所以,前面的方法对于这类【无扩展名】的URL来讲,是无效的。

 

对于这类无扩展名的URL,在IIS6中可使用添加【通配符应用程序映射】的方法来解决。
回到【应用程序配置】对话框,点击【插入...】按钮,弹出下面的对话框:

按照图片来设置一下吧。而后,【肯定】关闭对话框。此时的设置应该是这样的:

所有点击【肯定】关闭全部对话框。

让咱们再次回到示例程序,此时能够发现,什么问题都没有了。

再补充一句:若是使用这种方法,前面注册cspx的过程就不须要了。由于此时全部的请求都会交给ASP.NET,而ASP.NET会识别我在web.config中所作的配置。

目录的写入权限

为了方便MyMVC DEMO的部署过程, 此次我选择了XML文件作为数据源。写入XML的时机是在ASP.NET被中止运行的时候(Application_End事件中)。

让一个在IIS中运行的网站中止运行的方法就是中止网站所使用的【应用程序池】。
能够在网站属性对话框中找到网站所使用的【应用程序池】:

再切到IIS的【应用程序池】的列表,找到前面那个【应用程序池】,右击鼠标,
从弹出的菜单中点击【属性】菜单,而后在出现的对话框中选择【标识】选项卡:

从这个图片中,咱们能够知道网站以哪一个Windows账号在运行。记住这里,后面会用到。

好吧,点击【取消】关闭对话框。

补充一点:要想知道网站以什么账号运行,还能够查看【Windows任务管理器】, 找到w3wp.exe所在进程便可:

回到示例程序中,咱们能够随便添加一些数据。
而后,在【应用程序池】列表中,中止网站所使用的应用程序池。再启动它。
从新刷新示例程序的页面。

发现什么了?是否是数据没有保存下来?

若是发现数据没有保存起来,能够继续阅读。

数据不能保存的缘由并非由于代码没有执行,而是由于,网站运行的账号没有权限写数据文件。
XML是放在网站的App_Data目录中,为了检查网站是否有写入权限,能够在App_Data目录上右击, 而后选择【属性】菜单,切换到【安全】选项卡:

通过前面的分析,咱们已经知道网站是以【NETWORK SERVICE】账号运行, 然而,在这个目录的安全设置中,并无容许【NETWORK SERVICE】账号能有写入权限, 因此,网站在中止运行时,是因为没有权限才致使不能保存数据的。

此时,咱们能够赋予【NETWORK SERVICE】账号对App_Data目录有写入权限。 设置以下图:

好了,您能够再去重启网站所在的【应用程序池】,会发现如今数据能正常保存了。

SQL SERVER的配置

FishWebLib DEMO中, 我为了演示个人通用数据访问层而引入了SQL SERVER, 所以,示例程序须要SQL SERVER的支持。

首先,仍是回到web.config,来看一下示例程序须要访问什么样的数据库:

注意:示例程序须要链接的SQL SERVER服务器是:localhost\sqlexpress

个人机器上安装了三个SQL SERVER的实例:

所以,我须要以【命名实例】的方式来访问。
若是您的机器将SQL SERVER作为【默认实例】来安装,则须要修改成:localhost

在示例的压缩包中,我提供了SQL SERVER所需的数据文件:db\MyNorthwind.mdf
在运行示例前,我须要将它【附加】到SQL SERVER中。

如今须要先启动 SQL Server Management Studio ,链接SQL SERVER的实例后,
在【对象资源管理器】的树型控件中,找到【数据库】节点,右击,而后点击【附加...】菜单,
在出现的对话框中,点击【添加...】按钮,选择MyNorthwind.mdf文件,而后点击【肯定】按钮。

我这边出错了。

再仔细地看一下,发现是日志文件没有找到形成的。
是的,我并没将日志文件也放在压缩包中。
好吧,在对话框中删除日志文件就能够了,再次【肯定】。

仍是出错:

注意了:此次的错误与前面的错误并不同。 此次是说没有目录的写入权限。

当遇到没有目录的访问权限时,咱们首先要知道程序是以什么账号在运行。
这是很是重要的。要否则,如何配置目录的访问权限呢?

判断程序以什么账号运行最简单方法就是:打开【Windows任务管理器】,而后去找进程。
这个方法可参考前面的过程。最终咱们能够发现sqlserver.exe是以【NETWORK SERVICE】账号在运行(个人机器是这样)。
好吧,再按照前面设置App_Data目录权限的方法再设置MyNorthwind.mdf文件所在目录的访问权限。

再次尝试【附加】数据库,将能成功完成。
在我机器上,如今已经能够运行示例程序了。

说明:若是因为种种缘由,不使用【Integrated Security=SSPI】的链接认证方式,还可使用【用户名/密码】的方式, 那就须要修改web.config中的链接字符串了。

小结:
1. 因为SQL SERVER的数据文件保存在Windows操做系统中,所以必须授予运行SQL SERVER进程的账号所必需的目录访问权限。
2. 链接到SQL SERVER时,也可能会由于SQL SERVER验证链接身份而失败,那么也必须配置须要的访问权限。

到此为止,示例所需的IIS配置以及SQL SERVER的配置都介绍完了。

在IIS7中部署ASP.NET程序

前面介绍了如何在IIS6中部署一个ASP.NET网站,现来看一下在IIS7.5中如何完成这个过程。
接下来的演示将以Windows 7的IIS7.5为准。

IIS7.5相对于IIS6的改进,给个人感受是:部署ASP.NET网站简直太容易了。

IIS7为了兼容老版本,它支持二种模式来运行ASP.NET程序:集成模式,经典模式。
所谓的经典模式,其实就是为了兼容IIS6的模式。下文将着重介绍集成模式,这样才能体现IIS改进的优点。

在IIS6中,咱们须要配置扩展名的映射或者通配符映射,将请求交给一个ISAPI筛选器,而后由它再交给ASP.NET, 最终由ASP.NET再将请求交给咱们的httpHandlers, httpModules。 咱们在web.config中配置的httpHandlers, httpModules,对于IIS6来讲是不可见的,因此,只能再次到IIS中配置。

从IIS7开始,IIS支持以一种称为【集成模式】的方式运行ASP.NET程序,此时,IIS能直接将请求交给ASP.NET的httpHandlers和httpModules, 并且还能够直接从web.config中直接读取配置,所以,只要咱们把web.config准备好,配置任务就很是简单了。

因为这个缘故,我在后来提供的示例中,在web.config中已增长对IIS7的支持。
如下就是二个示例项目所需的IIS7的配置部分。

FishWebLib DEMO只须要下面的配置就能够了:

MyMVC DEMO所需的配置以下:

以上这些配置会反映在IIS7.5的哪些地方看到呢?
请看下图:

在这个【处理器映射】列表中,前三个不正是我在web.config中的配置嘛。

前面还有一块fileExtensions的配置又是作什么的呢?
请看下图:

对于FishWebLib DEMO来讲,它使用了 cs, ascx 这样的扩展名, 并且这二个扩展名按照默认的配置是禁止访问的,因此在那个示例中,这段配置的用途是将这二个扩展名变成容许访问。

我在使用Windows7的IIS7.5时,还发现一个与IIS6不一样的地方,它会默认为每一个网站建立一个独立的应用程序池,并且运行账号也不是NETWORK SERVICE, 不过,咱们能够容易地在【应用程序池】的属性中去修改它。

小结:
在IIS7.5中部署ASP.NET网站是件容易的事,前提是:事先准备好web.config中的system.webServer配置节。
而后只须要建立在IIS中建立一个网站,并指向程序目录便可。
注意:若是程序须要访问本地文件或者数据库,那么还须要设置文件系统或者数据库的访问权限,具体可参考前面相关小节。

80端口和域名

在前面的演示中,为了简单,选择了25678这个端口,那是由于80端口已被使用。 这样作实际上不影响网站的运行,不过,URL看起来就不美观了。 一般HTTP默认是使用80端口,若是使用这个端口,那么URL中就不会出现端口号了。 为了让URL地址看起来更美观,按下来我将演示如何使用80端口。

在IIS中,为了能让一个网站程序运行在80号端口中,有2个办法:
1. 为网站程序使用其它的IP地址的80端口。
2. 为网站指定域名绑定。

咱们能够在网卡的配置中新增一个IP地址(若是已经有多个IP就不用这样作了):

而后在IIS中,为网站设置【绑定】,使用这个IP地址了。请参考下图:

除了使用新IP地址的方式外,咱们还可使用域名的方式让网站能够在80端口下面运行。
方法仍是在IIS中设置网站的【绑定】操做,给网站指定一个域名便可:

最终的设置应该是下面这个样子的:

此时咱们就可使用下面二种方式来访问个人示例网站了:
http://192.168.0.222
http://www.mymvc-demo.com

不过这里又有个新问题:域名从哪里来?

答案有二个(对于演示来讲):
1. 修改 C:\Windows\System32\drivers\etc\hosts 文件,
  增长一个映射条目:127.0.0.1 www.mymvc-demo.com 便可。
2. 若是您使用的是Windows Server的操做系统,也能够本身给本身分配域名,请继续阅读。

在Windows Server的操做系统中,咱们可使用DNS服务建立本身的域名,大体的过程是:
1. 建立一个反向查找区域。
2. 建立一个正向查找区域。
3. 在正向查找区域新建一个WWW的主机。
4. 在IIS中为网站设置绑定,指向新的域名。
5. 设置网卡的DNS服务器地址,指向有DNS服务的机器。
这种方式或许对于单台机器来讲,比直接修改host文件要麻烦,但若是是在局域网内部使用将会很是方便。

DNS配置的相关过程以下:(向导中没有贴图的步骤能够直接肯定)

如今咱们就可使用域名的方式来浏览个人示例了:

相关文章
相关标签/搜索