初次將現有的 MVC2 專案上傳至 Azure 和 問題排除

初次將現有的 MVC2 專案上傳至 Azure 和 問題排除

之前都是用預設的專案,總覺得心裡面有點不太踏實!

所以,我就決定要將我手上已經寫好現成的 Web 網站,直接搬上 Azure 上

 

當然不需要重寫,只要「新增 Windows Azure 專案」 和 「調整 Web.Config」 就可以搞定啦!

 

這次是選平常最常用的 TailspinToys 網站

是用到 MVC2、SQL Server 的網站

.NET Framework 則是已經升級到 4.0

 

開發環境

VS 2010 Ultimate SP1

SQL 2008 R2

Windows 2008 R2

Windows Azure SDK 1.4

 

有幾個地方要特別注意!

若您的系統是 ASP.NET Web Site 請用工具轉換成 Web Application

另外,編譯的時候請選擇 Any CPU 或是 x64

 

======== 資料庫前置作業 ==========

資料庫的部分我是直接放到 SQL Azure 上

可以參考 初次使用 SQL Azure 建立 DB Schema

 

======== 新增 Windows Azure 專案 ==========

 

 

image_thumb[3]

可以看到專案中是很平常的 ASP.NET Web Application 專案 ( MVC 2 )

在方案 –> 加入 –> 新增專案

 

image_thumb[4]

選擇 Cloud –> Windows Azure Project

若是沒有安裝過 Azure SDK 1.4 的話,請參考

初次使用 Azure 的環境建置和問題排除 for MVC 3

 

image

因為我們方案已經有現成的 Web Application ,所以什麼都不用選,直接按 OK !

 

image

Roles –> Add –> Web Role Project in solution

 

-------------- 引用元件 設定 -------------------------------

 

image

選取網站。

再次提醒,一定要是 Web Application

 

這樣子 Windows Azure 專案就設定完成了!很簡單吧!

 

接下來回到原本的 Web 專案吧!

我這裡是 TailspinToys Web AP

 

因為專案放在 Azure 上想要用 Azure 的資源或是分析功能的話,就必須引用 Azure SDK 元件

Tip:要用 分析功能 的話,請將 .NET Framework 直升上 4.0

image

請加入這三個項目

 

"Microsoft.WindowsAzure.Diagnostics.dll"

"Microsoft.WindowsAzure.ServiceRuntime.dll"

"Microsoft.WindowsAzure.StorageClient.dll"

 

--------------  Web.Config 設定 -------------------------------

接下來只要設定好 Config 檔就可以了!

 

#########################

新增 在 configuration 區段中,沒有這個的話 日後佈署發生了問題會讓你很痛苦

就如同瞎子摸象

 

<system.diagnostics>
  <trace>
    <listeners>
      <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="AzureDiagnostics">
        <filter type="" />
      </add>
    </listeners>
  </trace>
</system.diagnostics>

#########################

一樣也是新增在 configuration 區段中,因為這裡是用 MVC 2.0 ,所以這裡的版號是 2.0.0.0

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

 

###### 刪除  ###################

configSection 區段

<configSections>
<sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
</sectionGroup>
<section name="microsoft.scripting" type="Microsoft.Scripting.Hosting.Configuration.Section, Microsoft.Scripting, Version=0.9.5.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false"/>
</configSections>
<appSettings/>

###### 更換 ###################

取代原來的 system.webServer 區段

<system.webServer>
  <validation validateIntegratedModeConfiguration="false" />
  <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>

 

###### 更換 ###################

取代原本的 compilation 區段的屬性

<compilation debug="true" targetFramework="4.0">

 

這樣子 Web.config 就統統設定完成啦!有沒有很簡單!

 

接下來就用 Windows Azure 設為啟動專案,按下 F5 執行吧!

若是設定都正常就可以順利執行

---------------------------------------------------------------

若是以上的設定有任何錯誤的話,會發現

Azure 專案會一直做 初始化、等待、重新啟動 什麼的 一直不停的循環

或是出現以下的錯誤訊息

不用擔心,這絕對不是 Azure 壞掉了,絕大都是 config 設定有問題所造成的

只要按照上述的方法大致上都可以順利完成 ( 上述是以 MVC2 為主 )

 

image

There was an error attaching the debugger to the IIS worker process for URL  xxxxx   for role instance ‘deployment(xx).佈署專案名稱.網站.角色.Instance號碼。無法在 Web 伺服器上啟動偵錯。Web 伺服器找不到要求的資源。

image

請確定伺服器正常運作。透過 Debug.Start 但不偵錯的方式確認 web.config 中沒有語法錯誤。您也可以參考線上文件中 ASP.NET 以及 ATL Server 偵錯主題的內容。

 

-------------------------------------------------------------------

-------------- 進階 Web.Config 設定 -------------------------------

 

這裡非常非常地建議,一定要用 組態轉換 功能

因為這會讓你在 本機端測試 和 Azure 上測試有非常大的幫助

這樣子就不用一直改 Web.Config 了

 

若是你的專案想要同時可以佈署到 本機的 IIS 和 雲端的 Azure 上的話

建議一定要用

 

這是 ASP.NET 4.0 的新功能,若是像我一樣是從 ASP.NET 2.0 升上來的話

可以用以下方式新增

 

為了因應 Azure 的環境,這裡特別新增了一組 Azure 組態檔

image

建置-->組態管理員-->新增組態

取一個名稱後就可以了 ( 這裡是取 Azure )

 

image

Web.Config –> 新增組態轉換

 

image

可以看到 Web.Config 底下多了三組 Config 檔

開啟 Azure.Config 後,將 connectionStrings 的區段開啟並填入 SQL Azure 的連線字串就可以了

Tip:name 的部分請跟 web.config 要替換的連線字串名稱一樣。

 

-------------------  佈署 Azure 專案  -------------------------------------------------------

和之前介紹的一樣,請先建立 Package

image

 

image

Build configuration 請選「Azure」 (若你自已另外命名 請自行選擇適當的)

 

 

image

第一次建立完成 Azure 專案

 

=========  問題排除  ============================

若出現以下的錯誤訊息,就代表 有元件是用 32 bit 的

image

無法載入檔案或組件 'Tailspin.Infrastructure' 或其相依性的其中之一。 試圖載入格式錯誤的程式。

image

請務必確認每一種組態的「平台目標」是不是都用 Any CPU 或是 x64

 

 

----------- 問題 1 ---------------------

若佈署到一半卡住的話!而且 Azure 管理平台出現以下你搞不懂的錯誤的話。

請務必要搭配 IntelliTrace 來偵錯。

 

別忘了,以前你可以在本機中透過 Visual Studio 看到程式碼在那一行掛掉

但現在執行的地方是在 Azure 上喔!你根本沒辦法直接用 VS 直接進行遠端偵錯

這個時候, IntelliTrace 就非常非常地重要,因為它可以幫你收集各種錯誤訊息

 

這可是開發人員必備的良葯啊 ( 遠目 )

 

image

Role has reported itself as unhealthy.

就這樣?就算用 Google 也找不到個所以然的。

 

所以要用 VS 2010 發行的時候,設定啟動 IntelliTrace 吧!

image

只要勾選就可以了!

再次提醒!一定要用 .NET Framework 4.0

蝦會?這個選項不能勾?請確認你安裝的版本是不是 Visual Studio 2010 Ultimate

 

什麼?你的 VS 2010 沒辦法發行?

請參考 初次用 VS 2010 部屬 MVC 3 上 Windows Azure

 

佈署有問題時就開啟「伺服器總管」

 

image

可以看到剛剛佈署的專案和 Web Role 後 選擇 View IntelliTrace logs

接下來 VS 2010 就會自動幫你從 Azure 上,下載 Log 檔回來

image

從 Log 上可以看到,例外狀況資料發生了什麼事

 

Unable to load the role entry point due to the following exceptions:
-- System.IO.FileNotFoundException: Could not load file or assembly 'System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.
File name: 'System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'

WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Soft

 

image

看到這個錯誤後,我馬上就知道了  因為以前有發生過類似的錯誤

ASP.NET 4 MVC 2 佈署到 IIS 7.5 問題 (4) - 手動佈署遠端主機

 

 image

Web 專案中的 參考—>System.Web.MVC-->屬性

將複製到本機 改成 True 就可以了,因為在 Azure 上 MVC 3 是內建的  但 2 不是

 

----------- 問題 2 ---------------------

image

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

 

這時再把 IntelliTrace 請出來

image

呃!原來發佈上 Azure 的連線字串搞錯了!再重新設定一下就好了!

 

 

--------------------------------------------

 

YES!!太棒了!可以順利在 Windows Azure 上看到剛剛發佈的專案。而且都可以正常下單

 

image

 

心得

第一次玩 Azure 的專案時是 Beta 版的時候,那個時候的管理工具還不是用 Silverlight

開發工具也不能直接連 ( 因為 2010 還沒出 )

 

現在可就不一樣了!

開發工具不只可以直接 One Click 發行,還可以有完整的偵錯資訊可以看

大大減輕了佈署時遇到的障礙

 

這時自已再跑過一次後,不由得再次對 Ruddy 老師 和 小朱大 肅然起敬呀! ( 立正 )

 

能在那樣子的環境,資訊都還不夠充份的情況下完成所有的步驟呀!

 

 

 

 

參考資料

初次使用 Azure 的環境建置和問題排除 for MVC 3

初次用 VS 2010 部屬 MVC 3 上 Windows Azure

初次使用 SQL Azure 建立 DB Schema

 

Identifying Status Messages in the Management Portal

http://msdn.microsoft.com/en-us/library/hh127564.aspx

 

[VS2010] ASP.NET 4.0 新功能:Web.config Minification 與 Transformation

ASP.NET Web.config 內容轉換