上文鏈接:
在虛擬主機上搭建mvc+silverlight流程與要點 (上)
本文提要
虛擬主機使用說明。
Web發布部署時該注意的DLL問題與說明。
如何解決mvc發布到iis6的路徑解析問題。
Silverlight的部署無法顯示問題。
開始部署
虛擬主機空間
購買虛擬主機以后你就會得到一個使用ftp訪問空間。這個空間的大小就是服務商承諾的大小。使用服務商指定的ftp地址訪問並輸入用戶名與密碼即可。
題外話:發生在我的新同事身上,不止一次。希望你們看到不要生氣,沒人知道誰是我同事的。當我發ftp://192.168.123.4,我們公司的ftp的地址給他們並告訴他們公司資料有一部分放上面。他們第一反應就是輸入到瀏覽器中。有又表達了一次:輸入到資源管理器中。他們都是先是一愣。我指了一個已經打開的文件夾的地址欄說這里,他們才恍然所悟。
后來我想,一是對ftp的知識有點陌生,二是對資源管理器這個名稱也比較陌生。也可見大家對一些基礎的操作系統的知識還是缺乏。所以大家說網絡課上教web,ftp部署等的課程到底是不是重要。那些所謂的專業名稱、術語到底有沒有用?
虛擬空間網站部署我比較推薦 ftp工具部署。今天先用Windows資源管理器直接訪問復制吧。
登錄進來以后,根據不同服務商你會有不同的文件。一般也就這三個。我見過的4,5種虛擬主機空間都是這樣的。但應該會有例外。
db:存放web的備份,數據庫的備份文件夾
log:存放web歷史記錄的文件夾
web:就是你要放網站的地方了。
Web發布
右擊一個網站項目,點擊發布,如下圖
這里感覺虛擬主機需要,我只說FTP與文件系統部署。
FTP部署:
這里的web文件夾是針對上面說的,把網站目錄放在web文件夾中的虛擬主機。根據你的情況填寫路徑。並填上用戶名與密碼就可以發布了。
但這個方法穩定性不是很好,就是偶爾會那么失敗幾次。原因看vs輸出說明,可能網速問題,安全問題,或不知道什么原因。這時候就換文件系統部署吧。
文件系統部署:
這里目標位置指定一個空文件夾,否則文件就會發布到那個文件夾目錄下,如果是一個有文件的文件夾,就會很亂。好,點擊發布
我的桌面上就多了一個web文件夾。然后,就把里面的內容復制到上面的ftp的web文件夾下面吧!你的網站就發布成功了!
就這么結束了?不!你可別開心太早,我們部署的可是mvc!
MVC的部署需知
回頭想想,我們要建立一個mvc3的步驟:
安裝好vs2010,新建工程發現沒有mvc3,明白沒安裝
上網下mvc3的安裝包,漢化包,安裝…
新建工程,選.net formwork4.0,有了。
新建好,可以運行了。
然后如同上面步驟,發布mvc3的項目。
bin下面有那些文件,只有4個。不錯,你按F5的時候可以運行,一切正常。
但發布了不一定可以運行。Why?
回想mvc安裝步驟。
如果你發布到的不是本機的iis上。你能保證發布目標的機器安裝了mvc3的安裝包。
那沒有安裝mvc3的機器我們該怎么辦?
分析這個問題:
安裝了mvc3的機子有哪些不同?打開:
64位: C:\Program Files (x86)\Microsoft ASP.NET
32位:C:\Program Files\Microsoft ASP.NET
這還不是要點。現在打開你的工程,找到引用,對着System.Web.Mvc按F4或點開右鍵菜單,點屬性
看屬性圖說話:
運行時版本:需要.net 4.0。也就是說應用這個dll必須要.net 4.0。當然,有很多文件可以用2.0支持,如System.Web也有2.0運行時的版本。但mvc3的運行時就必須要用4.0,因為內部代碼必須用到4.0的相關功能。
復制本地:就是要不要把這個dll復制到bin文件夾中,所謂的本地,就是隨發布而復制
路徑:就是說這個dll文件存放路徑。要點來了。似曾相識的路徑。對,就是mvc3安裝路徑!
說明:當一台安裝有.net4.0卻沒有安裝mvc3的機子又怎么去引用mvc3安裝目錄下的dll哪?所以我們必須復制本地,讓vs把mvc3的dll帶上,放在bin里面,問題就解決了。所以,沒有安裝mvc3的機子,只要復制本地,就可以解決這個問題。
再說明:不僅僅是mvc3這個dll安裝的機子上會沒有,大部分的dll都可能會沒有。簡單的說就是除非是.net 4.0原生支持的dll因為安裝.net formwork 4.0的時候會被安裝進去。很多dll是因為我們安裝vs2010才被安裝進去的。如System.Web.Helpers就是一個vs2010安裝后才有的dll。
所以,最簡單的方法就是,全部設置為復制本地。本身dll就不大。一般就幾mb。對空間不會照成負擔。只要下次發布是時候選擇“用本地副本替換匹配的文件”。這樣就避免重復復制dll。這也是部署mvc3要關注的問題。
有些人會說,我就是不想全復制進去,我有怎么知道那些有沒有?
當你將缺少dll的web發布出去,你訪問的時候會報錯。但出於安全要求,是不會顯示錯誤的。所以你要在web.config打開錯處顯示。
<system.web>
<customErrors mode="On"/>
先不管英語說啥了。紅色那行就是你卻的Dll。(小心頁面有變化但因為IE緩存頁面而看不出來)
然后咋辦?
自己去有dll的自己上安裝路徑找那個DLL復制到發布的Web的bin目錄下面。
都說全復制本地最方便。呵呵!
MVC路徑解析
mvc3要部署在iis6上面,解決.net 4.0與dll的問題還是不夠的。還有一個路徑解析問題。
這個問題是出在iis6的部署上,iis6以上版本不會再有。
添加解析:右擊IIS中的網站選擇“屬性”-“主目錄”-“配置”-“映射”-“插入”,配置如下:可執行文件:C:\WINDOWS\Microsoft.NET\Framework\v4.0.30196\aspnet_isapi.dll,確認文件是否存在:不選中點擊確定,最后如下圖所示:
要改iis6,虛擬主機怎么辦?
首先接受現實。總不能為解決這個問題黑了人家服務器吧!
然后找服務商客戶談,把這個修改內容發給客服或技術人員。讓他們給解決。
但事情往往不是那么順利的。
對方可能沒有服務器的操作權利,或者不提供配置服務,或要領導批准后不了了之。
那我們就只有自力更生的!通過迂回達到我的目標。
需要在項目中添加兩個文件與修改Global.asax.cs
添加:Default.aspx,全部內容如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="DemonstrateWeb._Default" %> <%-- Please do not delete this file. It is used to ensure that ASP.NET MVC is activated by IIS when a user makes a "/" request to the server. --%>
代碼文件:Default.aspx.cs,全部內容如下:
using System.Web; using System.Web.Mvc; using System.Web.UI; namespace DemonstrateWeb { public partial class _Default : Page { public void Page_Load(object sender, System.EventArgs e) { // Change the current path so that the Routing handler can correctly interpret // the request, then restore the original path so that the OutputCache module // can correctly process the response (if caching is enabled). string originalPath = Request.Path; HttpContext.Current.RewritePath(Request.ApplicationPath, false); IHttpHandler httpHandler = new MvcHttpHandler(); httpHandler.ProcessRequest(HttpContext.Current); HttpContext.Current.RewritePath(originalPath, false); } } }
添加這樣的文件就是因為mvc中沒有Default.aspx主頁.
我們需要讓默認主頁轉到mvc的路由上。
修改Global.asax.cs
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default", // 路由名稱 "{controller}/{action}.aspx/{id}", // 帶有參數的 URL new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 參數默認值 ); routes.MapRoute("NoAction", "{controller}.aspx", new { controller = "home", action = "index", id = "" });//無Action的匹配 routes.MapRoute("NoID", "{controller}/{action}.aspx", new { controller = "home", action = "index", id = "" });//無ID的匹配 routes.MapRoute("Root", "", new { controller = "home", action = "index", id = "" });//根目錄匹配 }
這里我們改變的路由注冊函數。其實簡單的說就是在所有的路徑后面加上aspx。如:
http://localhost:3572/home/index.aspx
這樣iis6就能識別出來了,這樣一定讓你很糾結,但卻沒有更好的辦法。
說以如果服務商的技術人員能幫我處理好路徑解析是最好的!
Silverlight的部署問題
SilverLight的部署問題其實就是.xap文件名是否能被服務器支持的問題。
解決的方法:
添加MIME類型。
.xaml application/xaml+xml
.xap application/x-silverlight-app
如圖:
很多服務商會主機管理提供這個服務。
下面方法搜索到的,沒有嘗試過、
但是大多數時候我們並沒有操作IIS的權限。
把.xap文件名改為.zip(原因大家應該知道,xap文件其實就是zip)。但是zip也可能不會被服務器支持,因為這些免費的空間只能顯示HTML!因此我把.xap改成了.html,SilverLight程序就可以神奇的顯示在HTML頁面里了。
如果還有欠缺內容,歡迎回復,我會補充,關於Membership的設置,會再寫一文。
如有疑問可以交流。