2012年12月2日

Visual Studio - 超強的程式碼分析功能Code Map

老實說,這次Visual Studio 2012 Update 1 更新,最吸引到我的東西就是Code Map ( 好吧,其他功能小弟我也還沒好好的使用過XDD ),但不管怎樣,Code Map真的值得特別拿一篇出來講一下,雖然可能沒辦法把全部功能講完,但至少透過下面這個例子,就可以感受到Code Map的強大;而且Visual Studio 2012 Update 1的更新,也是中文版的,我想,大家亂用亂用XDD,應該也可以實驗出不錯的心得,所以這篇只是簡單的介紹入門,詳細的分析和應用,就交給各位前輩補齊了 ( 逃~ )。喔,對了,這個Code Map不是2012擴充套件的Code Map喔…是微軟Visual Studio 2012 Update 1提供的新功能。

首先,甚麼是Code Map?,如果懶得看這篇文章的人,也可以直接看官方的影片;簡單的說,這個工具類似反向工具一樣,可以幫我們把想要看的Class關係、Function關係,用圖表關聯起起來,甚至還可以點兩下後,快速的尋覽;用了此功能後,會更加地想要使用雙螢幕的衝動!?

廢話不多說,我們就稍微看一下Code Map的功能吧,例如下圖,我們可以看到,一個HomeController 繼承了 Controller ( 這裡是MVC專案,但小弟我這篇不會講到甚麼MVC的東西,只是簡單的使用MVC的檔案來介紹Code Map,所以大家不用擔心。 )

image

這時,如果我們在HomeController上面點滑鼠左鍵,就可以看到如下圖,在Code Map上顯示。

image

接下來,就會在旁邊的視窗,看到HomeController的圖案出現了,就如同神奇寶貝一樣,出現了!!

image

這時候,我們就可以叫這個神奇寶貝用技能,喔,不是,是在HomeController上按下滑鼠左鍵,我們就可以看到很多的選項,我們先選簡單的顯示基底類別。

image

這時候,我們的Code Map就會出現HomeController的基底型別"Controller",如下圖,就可以看到,真的和程式碼一模一樣!!( 好,我知道大家看到這邊,會想罵人XDD,因為這個連小弟我用程式碼都可以看的出來,HomeController是繼承於Controller,這有甚麼好畫出圖的… )

image

但實際上,就算是在HomeController裡面的ActionResult類別,也可以直接叫出選單,來產生Map喔!!( 但要注意,如果沒有加入MVC的Source Code,也會無法顯示出MAP,簡單的說,他是利用Source Code來產生,如果那個Class是已經被包在dll裡面,則會無法產生出來。 )

好吧,我承認,用尋覽的方式,還是可以跳到ActionResult的程式碼裡面( 如果有MVC Source Code的話 ),感覺上也還好,不夠炫。

image

我們這次回到HomeController的圖上,這次我們使用顯示這一項參考的型別。

image

這時候就比較有感覺了吧,我們可以從下圖看到,HomeController參考了那些Class,這時候,如果這個Class比較多東西,那我們就可以從此圖表一目了然!!,而如果選擇了"顯示參考這一項的型別",就會列出有使用到HomeController的Class喔!!

image

到這邊,有沒有覺得很方便!?,如果是以前,我們可能並須用Search的方式,然後整個一片大混亂,而現在,有圖表來幫我們顯示,而且點兩下圖表,就會自動跳到對應的程式碼喔!!

那這樣就結束了嗎??錯,連Function也可以;使用的方式一樣,我們也可以從Index()來產生出圖表。

image

甚至產生出這種圖表,都是自動產生的喔!!

image

那只能到Function嗎??錯,他的層級甚至到屬性喔!!連屬性的關係都可以搞出來,這真的是太強了!!

image

最後,完成的圖,當然可以寫註解;如果圖太亂,也可以利用Layout來調整;甚至可以直接利用電子郵件寄出,也支援存檔。

image

基本上就這樣嚕,基本上,用了之後,就會想使用雙螢幕,或是30吋的螢幕了…Orz…

後記

這個功能真的是太強大了,光是這個功能,就100%值得升級到Update 1,升級完的那天,小弟我用這個功能去debug,原本複雜的關係,一下子就釐清,一下子就把bug給修好,也就有更多的時間可以聊天,喔,不是,有更多的時間可以處理更多的bug了!!那麼好的東西,還不趕快去升級!!( 參考網址有Visual Studio 2012 Update 1的位置 )

參考網址

ASP.NET MVC - 使用ASP.NET MVC 4的原始碼進行除錯

當然,這篇也不是甚麼大新聞了,如果常追蹤一些前輩Blog的人,因該已經有很多類似的文章,例如黑暗大大保哥KKBruce哥Kevin哥,都寫得詳細到爆炸。

但是小弟基於自己筆記自己紀錄的立場XDD,所以還是稍微紀錄一下自己的過程。

首先,我們要先下載Source Code,可以到這邊下載

image

如果有使用Git的人,也可以使用Git來進行下載,沒使用Git的人可以跳過這段落,直接按上面的連結就可以,並直接跳過此段,看後面的步驟;如果有使用Git的人,我們可以使用以下命令,把Source Code下載回Local端。

git clone https://git01.codeplex.com/aspnetwebstack.git

而clone後面接的網址,可以從ASP.NET CodePlex專案的頁面得知。

image

下載完成後,我們要的專案,主要都在src這個目錄下。

image

接下來,我們就可以開一個專案,無論是要用空白專案範本,或是網際網路專案範本,或是現在開發中的專案 ( 只要心臟夠大顆的話= =+ )都可以來進行Trace;我們只要在要進行Trace的方案上面,使用加入現有專案。

image

主要準備加入的是以下五個專案:

  • System.Web.Mvc
  • System.Web.Razor
  • System.Web.WebPages
  • System.Web.WebPages.Deployment
  • System.Web.WebPages.Razor

不過,事情就是沒想想中的順利= =…

image

加入的時候,可能會碰到這個問題,主要是因為現在的MVC Source Code也有用到NuGet了,而且有使用到NuGet的套件還原功能,而目前我們準備的專案(MvcApplication2)還沒啟用此功能。錯誤訊息如下:

找不到匯入的專案 "c:\xxx\.nuget\nuget.targets"`。請確認<Import>宣告中的路徑正確,而且檔案存在磁碟上。c:\xxx\src\System.Web.Mvc\System.Web.Mvc.csproj

image

這時候,我們只要去方案的地方,啟用NuGet套件還原。

image

完成後,就可以看到NuGet.targets已經加上去了。

image

在一次,就可以順利加上去了。

image

接下來,我們要把MvcApplication2原本參考的dll移除,換上我們剛剛加的專案。( 因為MvcApplication2的參考太長,所以下圖是新開了一個MvcApplicaiton1的專案來解釋。 );一樣移除那五個。

image

接下來,我們把剛剛加入進來的專案,參考進來。

image

接下來,我們要修改View目錄底下的web.config。

image

原本是長這樣( web.config後面不重要的就省略了 )

<?xml version="1.0"?>

<configuration>
  <configSections>
    <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
      <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    </sectionGroup>
  </configSections>

  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization"/>
        <add namespace="System.Web.Routing" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

而現在,我們要修改如下圖這四個地方,從逗點,把Version、Culture、PublicKeyToken通通移除。(最後面的引號要留下喔!!)

image

改完後,web.config變成這樣

<?xml version="1.0"?>

<configuration>
  <configSections>
    <sectionGroup name="system.web.webPages.razor" 
                  type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, 
                  System.Web.WebPages.Razor">
      <section name="host" 
               type="System.Web.WebPages.Razor.Configuration.HostSection, 
               System.Web.WebPages.Razor" 
               requirePermission="false" />
      <section name="pages" 
               type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, 
               System.Web.WebPages.Razor" 
               requirePermission="false" />
    </sectionGroup>
  </configSections>

  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, 
          System.Web.Mvc" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization"/>
        <add namespace="System.Web.Routing" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

就如同下圖:

image

而之前MVC 3的時代,還需要修改根目錄的web.config,現在不用修改了;所以改到這邊就算完成了。

另外,如果打開任何一個View,可能會發現,有許多的小蚯蚓。

image

關於這個問題,保哥有在MSDN反映過,最簡單的方法,就是在每個View上Using進來,大家可以參考這篇

後記

其實和各個前輩所寫的內容大同小異,也很感謝之前就有很多前輩分享過,而最近剛好想看一下MVC 4的Source Code,所以也順便把MVC 4的Source Code使用過程簡單整理一下,也希望讓真的有遇到問題的人,可以節省尋找解法的時間。

參考網址

2012年11月27日

Windows Azure - 升級Cloud Service到Windows Server 2012

前一段時間,看到Cloud Service已經開始支援Windows Server 2012的時候,很開心的就準備要去升級,所以小弟就到了下圖的畫面,選了Windows Server 2012。

image

然後悲劇就發生了… ( 好啦,也沒那麼悽慘,只是單純的錯誤。 )

錯誤訊息如下,簡單的說,就是不可以將Windows Server 2008 SP1直接升級到Windows Server 2012。

圖片 1

The Upgrade from OS family 1 to OS family 3 is not allowed

據說,Windows Server 2008 R2 升級 Windows Server 2012也會出錯。

The Upgrade from OS family 2 to OS family 3 is not allowed

這個案例,只要是發生在當Cloud Service上,已經使用Windows Server 2008或是Windows Server 2008 R2,而想升級成Windows Server 2012時,會發生的錯誤訊息;無論是使用如最上圖的升級方式,或是透過前篇,利用ServiceConfiguration.Cloud.cscfg改OSFamily,都會發生錯誤;只要目前Cloud Service上,還存在著Windows Server 2008或是R2。

所以要怎樣解決呢??

第一種方式

刪除現有的Cloud Service,然後透過前篇的方式,先設定ServiceConfiguration.Cloud.cscfg的OSFamily,最後佈署一個新的Cloud Service;不過,當刪除Cloud Service,建立新的Cloud Service的時候,IP位置,就會換了…所以不是很建議使用這種方式。

第二種方式 SWAP VIP

是的,SWAP VIP是最好的方式,大家可以參考這篇了解SWAP VIP,我們可以把修改過ServiceConfiguration.Cloud.cscfg的專案,佈署到Staging,然後再利用SWAP VIP進行切換;這樣就可以順利解決;當然,如果Staging目前上面已經在執行,也別忘記要先砍掉,在建立一個新的Staging;如下圖。

image

然後在UPDATE上新的Cloud Service到Staging,最後,再利用SWAP切換到Production,就可以順利升級到Windows Server 2012了 ( 也不算是升級了XDD,根本就是重新產生了… )

後記

相信未來會有越來越多人遇到這個問題,所以在這邊寫出來,希望能幫助到大家。

參考網址

Windows Azure - 佈署Cloud Service時,直接選擇想要的OS

相信如果有使用Cloud Service的人,因該都會知道,可以在Cloud Service管理畫面選擇想要的OS,看是Windows Server 2008,還是Windows Server 2008 R2,或是很潮的Windows Server 2012,如下圖。

image

但是不管怎樣選擇,大家可能會發現,剛剛佈署上去的Cloud Service,總是Windows Server 2008,如果每次都要進管理畫面調整,那不是很麻煩!?而且每次調整期間,又是一陣長時間的等待,難道都沒有別的辦法嗎?

其實在Visual Studio裡的Azure專案,是可以做調整的,首先,我們看到如下圖的Study4TwAzure專案,底下有一個ServiceConfiguration.Cloud.cscfg,那就是服務的設定檔,我們把他點開。

image

如下圖,osFamily就代表os的版本,1是08,2是R2,3就是2012,後面代表的是OS的版本,也就是第一張圖的Operating System Version,通常都是設定星號,代表自動選擇,當然也可以指定,接下來schemaVersion就是Azure SDK的版本,我這邊使用的是1.8。

image

為了方便大家觀看,也準備了文字格式,基本上和上面相同。

<?xml version="1.0" encoding="utf-8"?>
<ServiceConfiguration serviceName="Study4TwAzure" 
                      xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" 
  osFamily="3" osVersion="*" schemaVersion="2012-10.1.8">
  <Role name="Study4TwWork">
    <Instances count="1" />
    <ConfigurationSettings>
      <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="UseDevelopmentStorage=true" />
    </ConfigurationSettings>
  </Role>
  <Role name="Study4TwWeb">
    <Instances count="1" />
    <ConfigurationSettings>
      <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="UseDevelopmentStorage=true" />
    </ConfigurationSettings>
  </Role>
</ServiceConfiguration>

另外,補充一下,Instances Count的數字,就是代表需要Run幾個Instances,所以大家不要亂調整喔!!

當調整完後,我們佈署上去,就會自動幫我們建立Windows Server 2012的OS了!!

後記

如果想要知道詳細的一些設定,可以參考下面的MSDN參考網址。

參考網址

Windows Azure - Cloud Service的佈署方式

今天剛好有人問到,問我Cloud Service是怎樣佈署的,本來想說,把Blog網址丟過去交差了事( 疑!? 當然是開玩笑的XDD,我怎麼可能會做這種事情!! ),但後來發現,原來,我根本還沒寫過類似的文章 ( 所以也不能丟丟網址交差了事了…QQ ),所以這篇,教大家,幾個Cloud Service佈署的方式,另外,如果有去今年TechDays的朋友們,John哥那場也有介紹到這幾種方式喔!!

第一種 建立兩個Cloud Server

嗯,這也是小弟一開始使用的方式,假如正是網址為sky.com;簡單的說,就是準備兩個Cloud Service,A和B,當A是正式環境的時候,就把程式佈署到B,然後再利用自己架設的DNS,改變DNS,讓sky.com指向B的ip位置;所以Cloud Service B就變成正式的環境;同理,下次要佈署的時候,就佈署到A,然後再取改變DNS,讓sky.com指向A…嗯,當然小弟我就直接講結論了,基本上,除非不得已,不然真的不要用這種佈署方式…

第二種 直接覆蓋

其實在Cloud Service上,是可以直接覆蓋的,而且覆蓋期間,服務是不會中斷的( 官方文件是寫,如果有兩個Role以上,就不會中斷 ),簡單的說,就是只有一台Cloud Server A,而我們直接使用UpDate的方式,如下圖。

image

如果有多台Role,其實也不用擔心UPDATE會一口氣全部升級,我們可以從INSTANCES的地方看到UPDATE DOMAIN,簡單的說,Azure的升級,根據UPDATE DOMAIN的區塊進行升級,不過因為小弟這邊只用一個Web Role和Work Role,所以都是0,如果有兩個以上,就會發現有0,1,2等等不同的區段。

image

當然,這是一種升級方式,也是小弟後來使用的升級方式。

第三種方式 SWAP VIP

當然,小弟還是主推這種方式,因為這種方式真的是超級方便,不知道大家還記不記得,其實Cloud Service有分兩種Production和Staging ( 雖然兩個都要收錢… ),但是他既然這樣分,就自然有它的用意;所以這種佈署的方式,就是我們正式的Web頁面在Production上,而將我們準備要佈署新的頁面先佈署到Staging( 一個Cloud Service可以同時佈署不同的Production和Staging ),我們只要在DASHBOARD按下Staging,就可以切換到Staging,然後再按下下面的佈署,就可以佈署到Staging,而Production完全不會受到影響。image

當Staging佈署完成後,進入下一步之前,我們稍微回顧一下,現在我們的Production是正式環境,Staging是測試環境;如果依據版本來看,Staging目前放的是比較新的版本 ( 因為準備要替換掉目前Prodction線上的頁面嘛 ),那要如何做呢?我們只要按下SWAP按鈕,接下來按下ok。

image

是的,神奇的事情就這樣發生了SWAP的作用,就是將Prodction和Staging互換,簡單的說,原本準備卸下來,在Prodction的頁面,會變成Staging,而準備換上去,在Staging的新網站,會變成Production,所以,按下去後,我們放在Staging的新網站,就自動地被切換成新網站了!!當然,過程中,也不會中斷,全部交由Azure完成。

當然,後面的機制都是由Azure完成,主要是透過Role前面的Load Blance來切換位置,當然,這和我們使用者一點關係都沒有。

後記

是的,不用說,當然要用第三種方式,但也別忘記,放在Staging的網站,也是要算錢的,所以如果被換下來的舊網站,真的不需要的話,也別忘記砍掉,而第一二種方式就完全沒用了嗎?其實也不一定,或許某些場合,還是需要=v=,不管如何,這三種是Cloud Service佈署的一些小技巧,也給大家參考看看。

參考網址

TFS - 刪除不需要的使用者

今天和小章哥聊天,剛好聊到他說他的VS2012掛掉了 ( 好吧,我也必須負一半責任XDD,因為是我慫恿他玩Code Map的…Orz ),後來他貼給我他的解決方案,也讓我想到,我還有一篇文章還沒完成。 ( 但後來發現,解決方法,完全和小章哥的那篇無關… )

那我要處理的問題是甚麼?,就是在使用TFS的時候( 小弟是使用Team Foundation Service,不過處理方式和TFS應該都一樣 ),有時增加了一堆人,結果選擇的時候就會出現一堆人的列表,但那些人可能現在也不需要了,有可能離職了,也有可能退出專案了,總之,就已經消失出專案裡面,所以TFS也應該把這些人移除,如下,是一個例子,這裡是要新增新的使用者到此Team Porject,然後下拉選單一拉,結果有一堆人…,而這些人,早就應該刪除出整個Default Collection。

image

起初,我以為這是Cahce的問題,那解決的方式就應該用小章哥的那篇,結果後來發現,完全不是XDD,那應該怎樣做呢??

首先我們進入管理頁面,然後點選右上角的齒輪。

image

這邊就是控制中心了,選擇右下的管理Coolection Security和Group Membership。

image

進來後,再點選Users。

image

然後就會發現,之前加入過的使用者都在這邊了!!結果,和Cache完全無關!!Orz…( 由下圖可知,小弟很努力地在推廣TFS XDDD )

image

然後點選其中一位,並且按下右上的Edit,就會出現Delete的選項,刪除後,就可以和那位使用者說881了=v=。

image

以上,就那麼簡單,我完全沒注意到…或使這是自己一個人玩TFS的盲點吧,因為不太需要設定權限…所以一直沒發現在這邊…總之,這篇文章也推薦給新手吧QQ…

ASP.NET MVC - 將舊專案升級成.NET 4.5時,發生MSB3247錯誤

最近因為將ASP.NET MVC專案升級成.NET4.5,結果就發生了以下這個錯誤,主要原因是因為有組件使用了不同版本的.NET而造成衝突。

image

詳細的錯誤如下 :

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(1578,5): warning MSB3247: 在同一個相依組件的不同版本之間發現衝突。

那這個到底怎麼發生的呢?,我們稍微還原一下案發現場 ( 學一下黑暗大XDD )。

這個專案,原本是架構在.NET Framework 4之下,也是從ASP.NET MVC 3升級上來的,而我們希望,將此專案改成.NET Framework 4,也就是大算把目標Framework改成,.NET Framework 4.5。

image

當然,改完後,沒出現甚麼問題,但是按下編譯的時候,第一次,就會出現如下圖錯誤。( 第二次以後就不會出現警告了… )

image

但老實說,這個錯誤訊息,真的看不出個所以然,所以我們要先改一下,讓這個錯誤訊息輸出多一點的資訊,我們使用選擇Visual Studio的工具,選項,就可以打開下面的視窗;之後我們在MSBuild 專案組建輸出詳細等級,從最小改成詳細。

image

在一次的建置後( 記得要改回.net 4.0再改回.net 4.5才會再次出現警告 ),就可以發現,原來是system.net.http這個組件的關係。

image

知道後就好處理了,接下來,我們請出Google做查詢,結果果然查到,已經有人回報這個問題。

image

接下來,我們當然就是去看一下專案檔的內容,我們選擇了要升級.NET 4.5出錯的專案,並選擇卸載專案。

image

接下來在選擇編輯。

image

我們就可以找到目前System.Net.Http是2.0.0.0。

image

而今天,剛好Visual Studio 2012 update 1已經正式釋出,所以小弟也順便開一個新的ASP.NET MVC 4專案,來比對看看,目前新的專案,是如何參考的,如下。

image

既然新版的寫法都不一樣了,我們當然就使用新版的吧XDD,所以我們就把參照改成如下。

<Reference Include="System.Net.Http">
</Reference>
<Reference Include="System.Net.Http.Formatting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
  <HintPath>..\packages\Microsoft.AspNet.WebApi.Client.4.0.20710.0\lib\net40\System.Net.Http.Formatting.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http.WebRequest">
</Reference>

這樣,就不會有任何問題了~~

參考網址