• 如何在IIS6,7中部署ASP.NET网站(转)


    在我的第一篇博客中,我发布过一个示例项目, 主要演示了我的我的AJAX框架和我的通用数据访问层。 虽然在当初我认为我已考虑地比较周全了,而且还提供了足够的说明文档, 但在发布后的将近一年的时间里,还是有不少人给我发邮件,问我一些关于不能运行示例的问题。 在所有问题中,主要集中在IIS和SQL SERVER的配置方面。 因此,我认为还是有必要再来谈一下在IIS6/7以及SQL SERVER中部署ASP.NET网站的过程了。

    在上篇博客【写自己的ASP.NET MVC框架(下)】中, 我又发布了一个示例项目,它也包含一个网站项目,今天的介绍过程将主要以这个示例为主。 对于以前的示例所需配置的相同部分将不会重复介绍,不同点则会额外补充。

    回到顶部

    查看web.config文件

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

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

    这里要补充一点的是:有些开发人员喜欢将各类参数放在appSettings配置节中,即便是数据库的连接字符串也放在appSettings中。 我只能说:这是个很不好的习惯。因此,在部署这类网站时,可能还要注意一下appSettings是否包含数据库的连接字符串, 这就需要人工识别了。当然了,appSettings中还可能包含一些重要目录配置,同样,也只能人工识别了。

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

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

    回到顶部

    在IIS中创建网站

    每个ASP.NET程序都是一个网站,要想运行它们,都需要在IIS中部署它们, 部署的第一步就是要在IIS创建一个网站。 在IIS中创建网站的过程比较简单,因为IIS都提供向导界面来帮助我们完成这个配置过程, 因此,本文打算省略那些无意义的贴图。

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

    网站创建好了吗?我停下来等一下吧。

    我的网站配置好了,现在已经可以用浏览器访问它。

    现在我们可以切换风格来试试效果,点击页面右上角的【3】试试看。

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

    看到这个提示,不要茫然。为了界面友好,我用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配置的相关过程如下:(向导中没有贴图的步骤可以直接确定)

    现在我们就可以使用域名的方式来浏览我的示例了:

    Java学习交流群 636898482:有问题请及时加群咨询 Java一对一辅导 https://tomcode.taobao.com/
  • 相关阅读:
    使用FolderBrowserDialog组件选择文件夹
    使用OpenFileDialog组件打开多个文
    使用OpenFileDialog组件打开对话框
    获取弹出对话框的相关返回值
    PAT 甲级 1139 First Contact (30 分)
    PAT 甲级 1139 First Contact (30 分)
    PAT 甲级 1138 Postorder Traversal (25 分)
    PAT 甲级 1138 Postorder Traversal (25 分)
    PAT 甲级 1137 Final Grading (25 分)
    PAT 甲级 1137 Final Grading (25 分)
  • 原文地址:https://www.cnblogs.com/jsjjob/p/2371487.html
Copyright © 2020-2023  润新知