现在,程序也已经在本机IIS部署了,也测试了,该到发布到互联网上的时候了。本章节你将创建一个虚拟主机账户,然后将程序发布到该生产环境。
提醒:如果根据本章节所做的操作出现错误信息或一些功能不正常的话,请务必check Troubleshooting页面。
对于Contoso University程序和本系列教程,你需要选择一个支持ASP.NET 4和Web Deploy的虚拟主机。我们选择了一个主机提供商一般来展示一个完整的部署体验过程。由于每个不同的提供商提供不同的功能和部署流程,不过本教程的部署流程基本上涵盖了所有的步骤。本教程使用的提供商是Cytanium.com,使用它不代表认可以及推荐它。
如果你准备选择提供商了,你可以根据微软站点的提供商列表来比较各自支持的功能和价格。
在提供商那里创建一个账户,如果以及支持完整版的的话,我们在这个章节也不需要用到。但是后面的章节会讲到如何数据迁移至完整版的SQL Server上。
本教程,不需要你注册新的域名,你可以直接用现有的域名,也可以用提供商提供的临时URL地址来访问。
账户创建以后,通常你会收到一封欢迎邮件,里面包含了所有需要部署和管理站点的信息。不同的提供商发的邮件内容是不一样的,但是大概都是类似的。Cytanium发送的邮件一般包括如下信息:
Cytanium欢迎邮件里有一个可以更改.NET Framework版本的连接,该页面介绍了如何通过Cytanium控制面板来设置。其它的提供商的控制面板也许是不一样的,可能用其它的方式去操作。
访问控制面板地址,输入用户名和密码以后,将看到如下页面:
在Hosting Spaces框里,移动鼠标上去能看到2个连接,选择Web Sites。
在Web Sites框里,点击contosouniversity.com(创建账户时输入的名字)。
在Web Site Properties框里,选择Extensions选项卡:
将ASP.NET从2.0 Integrated Pipeline修改才4.0 (Integrated Pipeline),然后点击更新Update。
修改当前的build配置为Release,你可以从工具栏选择(如下图),或者从编译(Build)菜单里的配置管理器(Configuration Manager)里选择。
Solution Explorer里,右键ContosoUniversity项目,选择发布(Publish),弹出Publish Web对话框,里面显示的是Test profile,因为目前为止你只创建了这个。
在Publish profile框里,选择新建new:
输入新名称"Production"
在Service URL里输入提供商欢迎邮件里提供的地址
在Site/application里输入提供商欢迎邮件里提供的名称
选择 Mark as IIS application on destination.
确保选择上Leave extra files on destination (do not delete),如果不选择这个Web Deploy将会删除目标站点上有而解决方案里没有的文件,第一次部署没有影响,但是以后的升级部署可就惨了,选上它只是避免这些问题。例如,它会删除生产环境Elmah文件夹的日志文件(你解决方案里没有)。
选择Allow untrusted certificate.
输入提供商提供的认证账户信息
选择Save password以便不用每次都输入密码
点击发布(Publish)
这样程序就发布到虚拟主机上了,Output 窗口会显示发布结果。
还记得上个章节Elmah记录日志的时候需要设置写权限才能写入XML文件呢,在你本机的IIS上部署的时候需要手工设置。本小节,你将使用Cytanium 来设置这个(其它提供商也行不允许这么做,通常情况他们会提供特殊的目录让你写文件,这样的话,你就要修改你的程序只能在特殊的目录里写文件了)。
你可以在Cytanium控制面板里设置权限,访问控制面板URL,然后选择File Manager。
File Manager框里选择contosouniversity.com,可以看到根目录wwwrooot。点击Elmah右边的关闭锁图片。
在弹出的File/Folder Permissions窗口里,为contosouniversity.com选择Read和Write,点击保存(Set Permissions)。
对于Cytanium和SQL Server Compact,还有另外一个文件夹权限问题需要注意, 如果你运行程序的话,首页是没有问题的,但是其它牵涉到数据库操作的页面都会出现如下错误:
System.UnauthorizedAccessException : Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
原因是为了读取原生的程序集,NETWORK SERVICE账户会从bin目录读取这些程序集,但是它现在没有权限。(如果你想看到这个错误信息,你需要修改Web.config的错误配置为Off,然后重新部署,因为默认的生产环境显示的自定义错误页,而且你在错误报告页面也查不到错误信息,是因为根本就没权限写入这个错误信息。)
再次打开File Manager里的wwwroot,点击bin目录傍边的关闭锁图片,在File Folder Permissions弹窗里为contosouniversity.com和NETWORK SERVICE都选择上Read。然后选择Replace permissions on all child objects以后,点击Set Permissions保存设置。
打开创建账户时给的临时访问地址(该例是:http://contosouniversity.com.vserver01.cytanium.com),你可以看到和你本机Visual Studio里一样效果的首页,只不过不再显示Test和Dev指示符了,这就是说Web.config 的transformation以后的信息是正确的。
访问Students页面验证数据库里没有student记录:
访问Instructors页面验证Instructors数据依然保留在数据库里:
和测试环境一样,你需要验证生产环境的数据库是否能否正常操作,但通常不想输入测试数据进去,因为它是真正的生产环境。本章节依然使用同样的方式来测试,在真正的生产环境里你需要使用不同的方式去做这个事情,比如不输入测试数据也能验证的办法。当然除了要求不大,你也可以添加一些实用的数据进行测试然后再删除。
添加一个student然后访问Students页面看看数据是否存在,以此来验证数据库操作是否正常:
从Courses菜单选择Update Credits页面验证授权认证是否正常。正常显示了Log In 页面。
输入管理员账户和密码登录以后,Update Credits页面可以正常显示,说明ASP.NET membership数据库工作正常。
测试Elmah在生产错误日志的时候是否正常记录日志,访问一个非法的URL地址(例如Studentsxxx.aspx)。和以前一样,会显示GenericErrorPage.aspx页面,点击Log Out退出连接,运行Elmah.axd,再次显示Log In页面(验证了Web.config里对于Elmah认证的transform是否正确),登录以后,就可以看到刚才生产的错误信息了。
现在,已经成功部署了站点,并且验证了测试结果,这个站点就可以在公网上正式公开运行了。
在第5章我们提到了最可靠的测试方式是在主机提供商那里购买第2个账户作为测试环境,花费自然也要比在你本机IIS测试要高,但是为了防止生产环境出问题,购买第2个账户做测试也只值得的。
部署测试账户的流程和部署生产环境是几乎一样的,只需要走如下工作:
测试账户要考虑的事情是,它运行在公网上,但你不想让其它人访问,保存这个站点私有的话,你可以这么做:
第1调是最常用的,但每个提供商所处理的流程这里就不写了,如果你的提供商可以设置只允许你的IP地址房屋内,理论上就不用担心搜索引擎爬行了,尽管这样,部署一个robots.txt 以防万一。
部署的robots.txt应该是如下这样的:
User-agent: * Disallow: /
User-agent告诉搜索引擎下面的规则适用于所有的搜索引擎爬虫, Disallow 意味着所有的页面都不允许爬虫访问。
生产环境需要收录,所以不要部署这个文件。参考:Can I exclude specific files or folders from deployment? 以确保只在Release build里排除这个文件。
为测试环境专门创建第二个虚拟主机账户虽然不是必须的,但是非常值得的。下面的一些章节和使用IIS作为测试环境。
下一章节,你修改对程序走一些修改,然后重新部署到测试环境和生产环境。