在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
http://www.cnblogs.com/fish-li/archive/2012/02/26/2368989.html
阅读目录 在我的第一篇博客中,我发布过一个示例项目, 主要演示了我的我的AJAX框架和我的通用数据访问层。 虽然在当初我认为我已考虑地比较周全了,而且还提供了足够的说明文档, 但在发布后的将近一年的时间里,还是有不少人给我发邮件,问我一些关于不能运行示例的问题。 在所有问题中,主要集中在IIS和SQL SERVER的配置方面。 因此,我认为还是有必要再来谈一下在IIS6/7以及SQL SERVER中部署ASP.NET网站的过程了。 在上篇博客【写自己的ASP.NET MVC框架(下)】中, 我又发布了一个示例项目,它也包含一个网站项目,今天的介绍过程将主要以这个示例为主。 对于以前的示例所需配置的相同部分将不会重复介绍,不同点则会额外补充。 ASP.NET网站与一般的桌面程序不同,不是拷贝过来就能运行的(数据库连接除外)。 要想运行它,通常需要一些配置过程。 web.config通常会放在网站的根目录,这个文件中包含了一最重要的网站运行参数。比如: connectionStrings,httpHandlers,httpModules ,这些参数都是网站开发人员认为运行网站所必需的参数。 因此,如果我们想将一个网站部署到IIS中,必须首先打开web.config文件,逐个确认这些重要的参数是否符合要求。 这里要补充一点的是:有些开发人员喜欢将各类参数放在appSettings配置节中,即便是数据库的连接字符串也放在appSettings中。 我只能说:这是个很不好的习惯。因此,在部署这类网站时,可能还要注意一下appSettings是否包含数据库的连接字符串, 这就需要人工识别了。当然了,appSettings中还可能包含一些重要目录配置,同样,也只能人工识别了。 今天要讲述的参数主要涉及到IIS和SQL SERVER,因此本文将会分开介绍它们。 说明:通常我们在部署网站时,都应该先根据web.config定义的那些重要参数来配置网站。 但为了让您能对这些参数有较深刻的印象,下面的演示中,不是先根据web.config来配置网站, 而是采用【从创建一个站点后,一步一步地发现问题并解决】的方式来讲解这个过程。 在IIS中创建网站每个ASP.NET程序都是一个网站,要想运行它们,都需要在IIS中部署它们, 部署的第一步就是要在IIS创建一个网站。 在IIS中创建网站的过程比较简单,因为IIS都提供向导界面来帮助我们完成这个配置过程, 因此,本文打算省略那些无意义的贴图。 说明,我们先从IIS6开始。 这里只要求您在IIS中创建一个网站,把它配置成网站就可以了,其它的配置我们后面再谈。 网站创建好了吗?我停下来等一下吧。
我的网站配置好了,现在已经可以用浏览器访问它。 现在我们可以切换风格来试试效果,点击页面右上角的【3】试试看。 噢,怎么一开始就出错了: 看到这个提示,不要茫然。为了界面友好,我用JavaScript捕获了这个错误,但现在我们需要知道错误的原因是什么,怎么办呢? 有FireBug或者Fiddler2吗? 从FireBug中,我们可以看到,刚才的操作触发了一次请求,请求的地址是:/AjaxStyle/SetStyle.cspx <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】才对。 这个问题我用邮件回答过多次了,今天用博客的形式再回答一次: IIS6 添加扩展名映射回到IIS,在网站节点上,右击,从弹出的菜单中,选择【属性】,然后在弹出的对话框中,选择【主目录】选项卡,并点击【配置】按钮。 此时的界面应该是这样的: 找到【ascx】这个扩展名,双击它,是不是弹出下面这个对话框? 照着图片的操作去完成:复制【可执行文件】的设置路径。然后点击【取消】关闭对话框。 此时将回到【应用程序配置】对话框,点击【添加...】按钮, 照着图片操作吧。对话框中的【可执行文件】的参数,此时已在Windows剪切板中,现在只要粘贴就可以了。 全部【确定】,关闭所有对话框,再回到浏览器,然后再试一次。 现在可以操作了吧?
先不要点击其它链接,还是来对刚才的操作做个小结吧。 在ASP.NET中,有时候我们可能会需要创建自己所需的HttpHandler来处理一些特殊的请求。 /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来运行网站程序。 我再来解释一下,为什么在ASP.NET中,前面那个path能够识别我上面所说的5种格式的URL? (?:\A|(?<=/))[^/]*Ajax[^/]*/[^/]*\.cspx\z|(?:\A|(?<=/))[^/]*Ajax[^/]*\.[^/]*\.cspx\z 有兴趣的话,您也可以检验一下,这个正则表达式与前面的URL都能匹配。 前面解释了我为什么最终选择【.cspx】来向IIS注册处理器了。 这里要补充一点: 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所在进程即可: 回到示例程序中,我们可以随便添加一些数据。 发现什么了?是不是数据没有保存下来? 如果发现数据没有保存起来,可以继续阅读。 数据不能保存的原因并不是因为代码没有执行,而是因为,网站运行的帐号没有权限写数据文件。 经过前面的分析,我们已经知道网站是以【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所需的数据文件:db\MyNorthwind.mdf 现在需要先启动 SQL Server Management Studio ,连接SQL SERVER的实例后, 我这边出错了。 再仔细地看一下,发现是日志文件没有找到造成的。 还是出错: 注意了:这次的错误与前面的错误并不一样。 这次是说没有目录的写入权限。 当遇到没有目录的访问权限时,我们首先要知道程序是以什么帐号在运行。 判断程序以什么帐号运行最简单方法就是:打开【Windows任务管理器】,然后去找进程。 再次尝试【附加】数据库,将能成功完成。 说明:如果由于种种原因,不使用【Integrated Security=SSPI】的连接认证方式,还可以使用【用户名/密码】的方式, 那就需要修改web.config中的连接字符串了。 小结: 到此为止,示例所需的IIS配置以及SQL SERVER的配置都介绍完了。 在IIS7中部署ASP.NET程序前面介绍了如何在IIS6中部署一个ASP.NET网站,现来看一下在IIS7.5中如何完成这个过程。 IIS7.5相对于IIS6的改进,给我的感觉是:部署ASP.NET网站简直太容易了。 IIS7为了兼容老版本,它支持二种模式来运行ASP.NET程序:集成模式,经典模式。 在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的支持。 FishWebLib DEMO只需要下面的配置就可以了: MyMVC DEMO所需的配置如下: 以上这些配置会反映在IIS7.5的哪些地方看到呢? 在这个【处理器映射】列表中,前三个不正是我在web.config中的配置嘛。 前面还有一块fileExtensions的配置又是做什么的呢? 对于FishWebLib DEMO来说,它使用了 cs, ascx 这样的扩展名, 而且这二个扩展名按照默认的配置是禁止访问的,所以在那个示例中,这段配置的用途是将这二个扩展名变成允许访问。 我在使用Windows7的IIS7.5时,还发现一个与IIS6不同的地方,它会默认为每个网站创建一个独立的应用程序池,而且运行帐号也不是NETWORK SERVICE, 不过,我们可以容易地在【应用程序池】的属性中去修改它。 小结: 80端口和域名在前面的演示中,为了简单,选择了25678这个端口,那是因为80端口已被使用。 这样做实际上不影响网站的运行,不过,URL看起来就不美观了。 通常HTTP默认是使用80端口,如果使用这个端口,那么URL中就不会出现端口号了。 为了让URL地址看起来更美观,按下来我将演示如何使用80端口。 在IIS中,为了能让一个网站程序运行在80号端口中,有2个办法: 我们可以在网卡的配置中新增一个IP地址(如果已经有多个IP就不用这样做了): 然后在IIS中,为网站设置【绑定】,使用这个IP地址了。请参考下图: 除了使用新IP地址的方式外,我们还可以使用域名的方式让网站可以在80端口下面运行。 最终的设置应该是下面这个样子的: 此时我们就可以使用下面二种方式来访问我的示例网站了: 不过这里又有个新问题:域名从哪里来? 答案有二个(对于演示来说): 在Windows Server的操作系统中,我们可以使用DNS服务创建自己的域名,大致的过程是: DNS配置的相关过程如下:(向导中没有贴图的步骤可以直接确定) 现在我们就可以使用域名的方式来浏览我的示例了:
|
请发表评论