Quantcast
Channel: 天空的垃圾場
Viewing all 144 articles
Browse latest View live

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

$
0
0

最近因為將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>

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

參考網址


TFS - 刪除不需要的使用者

$
0
0

今天和小章哥聊天,剛好聊到他說他的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…

Windows Azure - Cloud Service的佈署方式

$
0
0

今天剛好有人問到,問我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佈署的一些小技巧,也給大家參考看看。

參考網址

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

$
0
0

相信如果有使用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到Windows Server 2012

$
0
0

前一段時間,看到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,根本就是重新產生了… )

後記

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

參考網址

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

$
0
0

當然,這篇也不是甚麼大新聞了,如果常追蹤一些前輩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使用過程簡單整理一下,也希望讓真的有遇到問題的人,可以節省尋找解法的時間。

參考網址

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

$
0
0

老實說,這次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的位置 )

參考網址

再見了2012 and 賀!突破十萬人大關

$
0
0

好啦…其實我相信,十萬人有多半都是我自己上來看我自己的筆記,還有一些問我問題,就順手丟過去網址的流量XDDD,但不管怎樣,既然都突破十萬人大關,再加上今年大家都順利度過芥末日,跨完2012年到2013年 and 好久沒寫碎碎念了,就順便慶祝一下吧XDDD

原本今年也表定,要每月寫至少十篇文章 ( 包含喇賽文 ),但現實上,還是有十分的困難阿XDD,尤其到年末,剛好有去參加Win App大賽 ( 其實是陪考團… ),所以12月文章數量遽減,只有短短的兩篇;但是還好,該筆記的還是有隨手筆記下來,未來1月再給他補一下;不過話說回來,每月十篇文章,還真的是有難度,但無論有無做到或達成,其實自己收益也滿多的,尤其快要老年癡呆的我,把看完的東西,弄成只有我自己看得懂的筆記 ( 疑!? ),當要回憶起來的時候還滿快的,而且如果剛好有路人碰到相同問題,也剛好看到這篇 ( 又剛好看得懂的話XDD ),也順手幫助到一個人…當然,前提之下,是寫的文章沒有錯誤…Orz…

最近隨著文章越來越多,越來越多朋友來看,有時相信大家也會有一些疑惑或是問題,基本上,小弟看到,都會盡量幫忙解答,但畢竟不是24HR掛在Blog上,所以有時候也是會有一些時差=v=;另外,有時候,一些艱難的問題XDDD,小弟也真的沒轍了QQ,此外,有時雖然看到問題,但是時間上,還沒空可以仔細看,幫忙解決,這部分也請大家多多見諒,畢竟小弟還是小小咖XDD,如果問題真的很急,也可以多利用Google,或是MSDN,裡面有很多的神人前輩,會幫忙解決的~~,如果真的是那種公司客戶超級麻煩問題,很棘手,如果公司願意,就砸錢問Microsoft裡面的技術人員吧… ( 不過我想,通常公司是不會願意付這個錢的QQ ),總之,對於問題沒辦法即時答覆,或是不知如何解決,也請各位朋友前輩們,多多見諒了QQ。

現在的技術變化很快,原本是打算,Blog的文章會進行更新,以更上時代,後來發現,現在的技術,就像是在打on-line Game一樣,每月一小改,每季一大改;每天我們光是衝副本,打寶寫攻略就來不及了…所以到現在,實在很難做到文章都是最新的境界;其次,每次改,畫面也給我大幅度變更,所以,請大家多見諒阿QQ;說到這個…改變速度最快的就是Azure了吧…不虧是雲端服務阿…

最後,還是很感謝業界朋友一路上的支持與鼓勵,收到很多朋友留言鼓勵與說讚!,都是小弟繼續撰寫文章的原動力,也希望新的一年,大家都萬事如意,bug少少。

新年快樂~~

Sky.


Windows App 開發嘉年華!制霸!

$
0
0

去年年底,最大的盛事,除了讓人失望的芥末日和歡喜的跨年外,大概就是這場熬夜熬到死,吃東西吃到撐死,除Bug除到煩死但卻High到翻天的36hr不斷電,不眠不休的Windows App 開發嘉年華的活動了;當然,小弟也有幸的,充當著年輕小伙子,跑去吃吃喝喝,喔,不是,去開發Windows App…當然,一堆人丟臉,比只有一個人丟臉來的好…Orz…所以也順便拖好朋友TerryShadow下水XDD…

當天將近300位高手,本來想好好地拍拍照,但畢竟當天是去Coding的,不是去玩樂的 ( 不想被某人扁 ),所以還是認真的去參加比賽XDD;不過事實證明,就算認真,也打不過其他高手…Orz… ( 早知道還是去吃吃喝喝好了= =… )

第一天早上,主要在設定一些東西,我們隊選了一個食物區前面的位置,當然,不為了甚麼,就是要搶得到食物!!

而一直到晚上前,其實也沒有多大的變化,我們隊友反正就是拼命寫Code…只是我比較不一樣,我竟然一整天都在搞設計QQ…看著別組有專門的設計人員,而我竟然在搞設計QQ…我是Developer耶!!

結果兩天的循環,就是設計、XAML、Code、JavaScrip、HTML、設計…無止境的循環…而Terry哥處理著人生第一次的圖片設計 ( 結果到比賽結束,Terry哥依舊脫離不了圖片的魔手,無論是設計、寫Code都和圖片有關XDD ),而Shadow則幫忙處理地圖定位,錄音,和整個系統整合。

到了第一天晚上,大概撐不下去的就撐不下去了,繼續努力的人,還是繼續努力,雖然當天外面下著雨,不過裡面還好,不會很寒冷,而且燈火通明,所以( 讓人想睡也睡不著!? )讓人會很想努力的寫Code!! ( 到了凌晨,我終於寫到C#….脫離萬惡的Blend… )

IMG_1357IMG_1358

小弟也利用am 4:00左右,到處走走晃晃,稍微休息一下 ( 而且好像也是這個時間點,被記者大哥偷拍…結果上了報= =,當然,上報是沒差,但可不可以不要拍到我禿頭!! (翻) );然後消夜是統一肉燥麵;但其實比較想吃雜醬麵說…這時候也發現,幾乎每個隊伍,都有帶設計人員,這時我是否應該很自豪地說,我就是設計人員呢!?

IMG_1360IMG_1361

第二天早上,是豐富的早餐,但當時,我已經不行了…只能看著隊友,吃吃喝喝…不過還是有喝一大杯豆漿…XDD

IMG_1363IMG_1362

第二天開始,大家就準備著最後衝刺!!,當然,這時候小弟又抽空跑出來溜搭一下,如下圖,大家可以發現,其實人真的不少,而且大家的作品幾乎都差不多了,甚至有3D的遊戲,超高的創意,還有很多高手QQ…

IMG_1364

而最後,在台上測試機器的時候,又順便偷拍一張,畢竟站上台上的機會也不多,趕快偷拍一下;而右下角,是我們這次的編號,也由此可以證明,非常吉利的數字,也不一定能帶來勝利XDD,平常的磨練還是最重要的…

IMG_1366IMG_1368

最後,上台開始Demo,結果整個過程哩哩拉拉= =…這塊就不想提了 ( 泣 );但從最後的結果來看,就算2min沒講完,其實只要讓評審覺得不錯,還是可以得獎的;我們反而太注意時間,再加上台上一些無聊的梗,反而造成大失敗… ( 雖然,好好報告,也不會成功到哪裡去= =… ),而這次也碰到很多業界的同伴來參加,所以在開發上,也不會那麼的無聊寂寞了XDD ( 雖然大家都是埋頭苦幹 ),但不管怎樣,也因為有這個活動,才讓小弟有機會去接觸到Windows 8的開發,在某個意義上,也算不錯啦…

最後的感想,相信這個活動一定也還有很多需要改進的地方,畢竟那麼大型的開發活動,這應該也是第一次舉辦,所以相信未來一定會更好;而這次也很感謝Eric哥的活動邀約,我們學到的東西,也非常的多;也希望這次沒有參加道的朋友,下次可以組隊來玩玩看;當然,能拿到冠軍是很不錯,但這中間的過程,絕對就像海賊王的航海一樣,收穫覺得會比你想像的多喔!!也很謝謝被我拖下水的夥伴喔!!~

結論…人果然是需要被激,才會引發出潛能的…

( 話說,比完後,我幾乎整整睡了兩天啊!!~~~我的跨年假!! )

Win Phone - 使用Mac開發Win Phone 8應用程式

$
0
0

雖然這篇寫著,如何使用Mac開發Win Phone 8應用程式,但可不代表小弟準備跨領域喔XDD,因為手上剛好有MacBook Pro,而且又聽到人家說,目前已經可以裝了,所以純粹只是想來安裝看看而已…

另外,話先說在前頭,真的想開發的人,請先直接移到這篇最底下,看一下後記,在認真地考慮一下,要不要繼續吧XDD。

這次的Win Phone 8 SDK因為有使用到Hyper-V來當作Win Phone 8的模擬器環境,所以剛推出的時候,小弟的Macbook Pro想當然,就是不能安裝,畢竟Hyper-V根本就跑步起來阿…,所以一開始的選擇,第一,只能使用Bootcamp;但小弟不是很喜歡Bootcamp。因為小弟已經用習慣Parallels來模擬Win 8了;第二個選擇就是使用VMWare來模擬,但是小弟都已經付錢給Parallels了,為了要開發Win Phone 8,還要再付錢,實在是付不下去… ( 其實是因為小弟本身就沒再玩Win Phone 8 Orz… );但後來還好,經過一段時間後,Parallels終於支援Hyper-V了;當然,前提之下,你的Macbook Pro也必須是新一點的CPU,才有支援VT,不然還是依樣啟動不起來的…接下來,我們就來看看怎樣設定Parallels… ( 其實現在有也官方也有中文教學了… )

首先,我們要去Parallels進行設定,如下,Nested VT記得打勾啟用;而目前Parallels官方也建議,如果要開發Win Phone 8,建議把Parallels設為一個CPU,目前兩個CPU以上似乎會出問題,未來會再修正此問題;此外,用Parallels模擬出來的Win8記憶體最好是大於2G,小弟自己是使用到4G啦…最近也深感不夠用的感覺QQ…

螢幕快照 2013-01-02 下午9.50.44

設定完成後,就可以順利進入Win 8,並且到下面這個網址下載Win Phone 8 SDK

http://www.microsoft.com/zh-tw/download/details.aspx?id=35471

如下,雖然看起來只有小小的1.0MB,但實際執行下去,就會去網路上邊裝邊下載= =+。

image

接下來,就可以開始安裝!!,留一下畫面,當作紀念…

image

經過漫長的等待 ( 真的很漫長,我都寫好另外兩篇喇賽文了= = ),終於安裝完成了,也可以看到,Hyper-V已經開啟,這時候就需要重新啟動一下,然後又會開始進入超級漫長的等待…

image

完成之後,我們要設定一下Hyper-V。

image

打開後,就可以發現,安裝玩Win Phone 8 SDK,預設就會幫我們準備好Win Phone 8的模擬器,接下來,我們要設定模擬器的CPU數。

image

預設是兩個CPU,根據Paralles官方的建議,如果這台win 8 OS的cpu數,只有給一個CPU,那下圖的位置,虛擬處理器數目的數量,就要改成1,但如果WIN 8 OS的CPU數目,超過1,那用預設的就可以了,以下是官方的敘述 :

如果您不按照以上建議設定 Windows 使用 1 個 CPU,則不要在 Hyper-V 虛擬機中更改處理器數量。

修改位置如下圖。

image

這樣就設定完成了,我們就可以用MAC搭配上Parallels來開發Win Phone 8了。

( 小弟還特別抓了mac下運作的畫面來證明喔!! )

螢幕快照 2013-01-03 下午1.15.18

這樣就完成嚕!!

後記

講是這樣講,但整個開起來的速度,因該會讓人瘋掉,所以真的想寫Win Phone 8的朋友們,還是不要這樣搞吧XDD,遠端桌面一台機器,應該都快很多…

參考資料

TFS - 使用NuGet套件還原功能,卻不會自動下載

$
0
0

最近大概是小弟推廣Team Foundation Service搭配NuGet,推廣得太有力,所以一堆人問了小弟這個問題,所以在這邊紀錄一下。

這個問題主要是使用Team Foundation Service取得版本控制的方案,而這個方案有使用NuGet的"啟用Nuget套件還原"功能,所以並不會把一些dll丟到版本控制裡面,並且透過NuGet,讓Build的時候,自動下載;但有的時候,下載下來的專案,就是會建置失敗,出現以下訊息。

Package restore is disabled by default.

這個表示,預設的情況下Package復原是關閉的,那表示很有可能該勾選的地方沒勾選到。如下。

image

這邊要勾選"允許NuGet在建置期間下載遺漏的套件"。

image

通常勾選後,就可以正常Build了,因為這個問題,滿多人問的,所以就在這邊紀錄一下。

SignalR - 無法與伺服器建立連線

$
0
0

SignalR是個很棒的東西,雖然目前也還沒正式版,但小弟已經拿來做了多次的實驗,並且也實際拿出來應用過,而今天,主要是紀錄一下之前發生的一個小問題。

這個問題主要是這樣,基本上,寫法和呼叫等等都是正確的,但是卻發生無法連線的錯誤,如下圖。

無法與伺服器 建立連線

image

先說解法,其實很簡單,我們只要在web.config裡面的httpRuntime這個tag加上targetFramework=”4.5”就可以了,如下。 ( 以下是web.config的片段 )

<system.web>
    <customErrors mode="Off"/>
    <httpRuntime targetFramework="4.5" />
    <compilation debug="true" targetFramework="4.5" />
    <pages>
      <namespaces>

這樣就不會產生錯誤了…

image

當然,因為近期一直都很忙,所以沒有實際的追進去看原因,但小弟猜測,因該是SignalR預設使用到了.NET 4.5的SOCKET機制,但web.config沒有特別指定版本而造成的錯誤;不過這也只是小弟的猜測,看看未來有沒有空,再來鑽進去看看;總之,先在這邊紀錄一下吧。

ASP.NET MVC - Area出現指定的組件名稱或程式碼庫無效之問題

$
0
0

這算是除錯短篇三部曲的最後一部XDD,不知道為什麼,最近都在處理這些奇奇怪怪的問題;這篇也是短短的一篇解決文章,起因也是朋友問我ASP.NET MVC Area的Url的一些問題,本來想很帥氣的,迅速地寫一篇範例來展現自己 ( 疑!? ),但後來卻發現另外一個問題…Orz…

要還原這個事件,其實很簡單,只要安裝完Visual Studio 2012 Update 1後,隨便打開一個ASP.NET MVC的專案,然後加一個Area,並且隨便設定設定Controller和View;最後打開瀏覽器,就會出現以下畫面…

建立 system.web.webPages.razor/host 的組態區段處理常式時發生錯誤: 指定的組件名稱或程式碼庫無效。 (發生例外狀況於 HRESULT: 0x80131047)

image

好,反正看到錯誤訊息後,大概就知道,是版本的問題了,所以打開view底下的Web.config來看看,位置如下圖。 ( 記住,是Area底下的View底下的Web.config )

image

打開如下,小弟我這邊只擷取段落,大家應該可以明顯地看到,Version後面接的像是變數的東西。( __WebPagesVersion__.0.0 這個字眼 )。

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

我想當初的好意,應該是為了讓Area的樣板可以無關於組件的版本,所以才這樣設計,但不知道為什麼,反而錯在這邊…,所以我們可以做調整,假設我們先調整Razor這個組件,改成特定的版本看看。( 改成Version=2.0.0.0 ),如下。

<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=__WebPagesVersion__.0.0, 
               Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
      <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, 
               System.Web.WebPages.Razor, Version=__WebPagesVersion__.0.0, 
               Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    </sectionGroup>
  </configSections>

結果就會如同下圖,恩,至少剛剛改的2.0.0.0那個有用了XDDD

image

既然確定了原因,那要怎樣做?,其實很簡單,我們其實可以直接把預設View底下的Web.config拷貝到Area底下的View底下的Web.config就可以了;如下圖,把"根"下的Views目錄,底下的Web.config裡面的內容,複製一份,貼到Test( 這是個Area )底下的Views目錄下的Web.config就可以了。

image

在一次執行,就可以了。( 恩…下圖不是缺圖,是因為我沒在View裡面寫任何文字XDD,所以輸出的View就是一片空白… )

image

大致上就這樣,這部分,未來官方應該會修正,有碰到錯誤的朋友,可以暫時先忍痛一下QQ..

參考網址

Windows Server - 使用Win8管理Windows Server

$
0
0

年底這段時間,果然是最忙的,Blog也超久沒更新,雖然有滿多東西可以寫得,但也一直沒時間寫阿!!,而今天,剛好利用一點小時間,就順便寫一下關於IT的東西,不過我畢竟不是把IT當作主力的XDD,大家就隨意看看吧。

過年大掃除,順便把家裡的舊電腦,裝起Windows Server 2012起來,而且因為搭配Hyper-V,所以就可以虛擬很多台電腦起來玩。

但是雖然很多台電腦,但要管理就會很麻煩,像以前,小弟都是一台一台的遠端桌面登進去,所以就會看到一堆遠端桌面的視窗…

但其實,我們可以使用工具,透過伺服器管理工具,就可以在Windows 8下,輕鬆的管理和查看Server的狀態喔!!

首先,我們要先去下面那個位置下載,有區分32和64位元版本,就看目前的windows 8是哪個版本就下載哪個版本。

http://www.microsoft.com/zh-tw/download/details.aspx?id=28972

image

例外,要注意一下,如果之前有安裝過,記得移除,如下是官方的重要事項說明

重要事項: 在您安裝 Windows 8 的遠端伺服器管理工具之前,請先從電腦移除所有舊版的系統管理工具包或遠端伺服器管理工具,包括較早的發行前版本以及不同語言或地區的工具版本。一次只能在電腦上安裝一份遠端伺服器管理工具。 如果您已經從 Windows 7 升級至 Windows 8,則必須在電腦上安裝 Windows 8 的遠端伺服器管理工具;在您已升級至 Windows 8 的電腦上,已經沒有舊版的遠端伺服器管理工具。

下載後,雖然說感覺像是新功能,但官方這邊是把他歸類為更新。

image

安裝完成後,就可以看到系統管理工具和伺服器管理員已經安裝完成了。

image

系統管理工具如下,都是依些Server的管理工具。

image

而伺服器管理員,就如同Windows Server的管理員一樣,相信對於IT高手的前輩們,這就不太需要介紹了=V=。

image

接下來,我們要把藥管理的伺服器加入到伺服器管理員。

image

如果有加入ad,那可以選擇第一個,但我們這邊還沒加入ad,所以選擇dns,然後我們可以搜尋框裡面填入主機名稱,或是ip位置,然後尋找到後,再把他加入到右邊。

image

加入完成後,馬上就會發生錯誤,錯誤訊息如下( 同下圖 ):

vm - 設定重新整理失敗,且發生下列錯誤: 因為下列錯誤,無法從伺服器抓取中繼資料: WinRM 用戶端無法處理該要求。若驗證配置與 Kerberos 不同,或是用戶端電腦沒有加入網域, 則必須使用 HTTPS 傳輸,或是將目標電腦新增到TrustedHosts組態設定中,請使用winrm.cmd來設定TrustedHosts。請注意,可能不會驗證在TrustedHosts清單中的電腦。您可以執行下列命令,已取得相關的詳細資訊: winrm help config。

所以接下來,我們要設定winrm,這樣就可以順利管理了。

image

根據官網的附註,如下:

如果您是從執行 Windows 7 的電腦管理遠端電腦,則啟動 Windows 遠端管理 (WinRM) 服務可以新增信任的主機。依序按一下 [開始][所有程式][附屬應用程式],並在 [命令提示字元]上按一下滑鼠右鍵,再按 [以系統管理員身分執行],以較高的使用者權限開啟命令提示字元工作階段。輸入下列命令,然後按 Enternet start winrm

對於工作群組對工作群組/網域狀況中的遠端連線,必須將遠端電腦新增到來源電腦上的信任主機清單中。若要這樣做,請以較高的使用者權限開啟 [命令提示字元] 視窗,在來源電腦上執行下列命令。

winrm set winrm/config/client @{TrustedHosts="RemoteComputerName"}

對於工作群組對工作群組/網域狀況的遠端連線,若使用者不是使用來源電腦內建的系統管理員帳戶登入,則必須設定下列 WinRM登錄機碼,才能從來源電腦進行遠端存取。由於對非 Administrators群組成員的系統管理員帳戶有使用者帳戶控制 (UAC) 限制,因此必須進行此變更。若要變更此登錄機碼,請以較高的使用者權限開啟命令提示字元,在來源電腦上執行下列命令。

reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f

WinRM預設允許每位使用者對遠端電腦的連線數量上限為五個。若要提高上限,請以較高的使用者權限開啟命令提示字元,在來源電腦上執行下列命令,其中 X 代表您想要允許的連線數量。

winrm s winrm/config/winrs @{MaxShellsPerUser="X"}

所以我們要在win 8下,設定winrm,我們可以先輸入winrm get winrm/config/client看看目前的設定。( 別忘了cmd要使用administrator權限來做設定喔!! )

image

接下來,我們輸入winrm set winrm/config/client @{TrustedHosts=”vm”},其中vm的就是要管理的那台server名稱。

image

接下來,我們重新整理後,會發現,拒絕存取,那是因為,我們沒有遠端那台電腦的帳號與權限。

image

我們選擇管理身分。

image

這邊,就輸入遠端的帳號與密碼。

image

這時候,我們就可以看到,在win 8下,可以順利的進行管理了!!

image

這樣就完成了!!

結論

透過伺服器管理員,我們就可以從win 8輕鬆的管理多台Server,也不用一台一台的遠端桌面過去看狀態,而這邊,比較麻煩的是因為沒加入ad,所以有比較多的步驟要處理,相信如果已經加入ad的電腦,會簡單許多;而這邊,小弟也簡單的獻曝,如果有錯,也請各位前輩多多指教。

參考資料

Windows Server - 未啟動效能計數器

$
0
0

這幾天持續進行著IT的奇幻之旅,而這篇,也是隨手的一個小筆記 (  IT的前輩們不要笑QQ,身為Developer的小小弟我,其實是很難搞懂Server的複雜的XDD )

這次的問題是這樣的,在安裝完Windows Server 2012後,在伺服器管理員這邊,發現了未啟動效能計數器!!或許對IT前輩來說,這是微不足道的問題,但對於小弟來說,完全不知道怎樣啟動阿XDDD,所以查了一下資料後,順便紀錄一下,不然下次又遇到,可能又找不到如何啟動了。

問題如下圖。

image

那怎樣解決呢!?其實很簡單,只要在伺服器管理員,選擇所有伺服器,往下拉,拉到下面這個畫面,並起選擇啟動效能計數器就可以了!!

image

這樣就完成了!!簡單吧…

後記

真的不要笑小弟阿,小弟真的找了好久…QQ…

參考網址


Windows Azure - 使用OData並利用Visual Studio佈署到Web Site要注意!

$
0
0

好久沒寫文章了,最近真的有點忙到翻掉,不過今天遇到一個找了超久的一個問題,所以還是趕快紀錄一下,不然應該馬上就忘記了。

這個發生的過程,是小弟我在寫ASP.NET MVC Web API並且搭配ODATA時遇到的一個狀況,嗯,簡單的說,如果是使用Local來測試,完全不會有任何問題,而是透過Visual Studio的佈署到Azurw上的Web Site時,因為疏忽,所以少設定了一個東西,所以在Web Site上,使用ODATA的時候一直發生錯誤… ( 結果這個錯誤,讓我花了一整個下午加上晚上…其中還陪伴著中華隊輸了14分QQ… ),所以在這邊紀錄一下,不然應該是滿容易忘記的。

這個錯誤的畫面如下,如果覺得有點小,可以直接點圖,看大圖;小弟我這邊特別用藍色的框框標明起來。

2013-3-10 上午 01-51-44

錯誤的訊息是。

There is already an open DataReader associated with this Command which must be closed first.

反正簡單的說,就是已經有打開了一個連線,必須要關閉…,但是為何local都沒有,但丟到Azure就出問題呢!?

後來交叉比對後,才發現,原來在部屬設定連線字串這邊。

image

進去後的這裡,要把MultipleActiveResults改成True ( 預設是false… )

2013-3-10 上午 01-51-03

完成後,再佈署一次就可以了。

後記

對了,相信一定會有人對於這個選項感到好奇,但小弟這邊不是偷懶不打XDD,而是已經有KK前輩寫過這方面的文章了,如果有興趣的朋友,可以去參考資料下,看一下。

參考資料

Windows Azure - 在Cloud Service中,使用多個Instance會導致IIS Express錯誤

$
0
0

這個問題,卡了我超級無敵久,可以說從去年12月開始,就出現了這個問題,直到最近,才終於請Microsoft的CSS部門的Michael幫忙解決…

至於為什麼會發生這個問題,老實說,也沒辦法還原了,只能歸咎,可能因為平常裝了太多測試版本的東西而導致。

這個錯誤大致上是這樣子的,平常我們在本地端使用Cloud Serivce開發時,會啟用IIS Express並帶起模擬器,平常使用都沒問題,但當我們啟用超過一個instance的時候就會發生錯誤;如下圖設定時,再啟用模擬器的時候,就會發生錯誤。

image

當設定一個instance以上,並啟用偵錯的時候,正常應該是開開心心的看到模擬器起來,但這次的問題就是,模擬器雖然起來了,但是IIS Express報錯了…

會出現 IIS Express Worker Process 已經停止運作…然後任何的錯誤訊息都不給我 ( 翻 )。

IIS Express Work Process Error

當然,這個過程,其實也找了很久,而且如果開模擬器來看,也會發現兩個Role阿,很正常啊。

Azure Computer

但實際上,如果有真的去測試,會發現,只會進到一台Role,死都不會進入到另外一台Role…後來抽絲剝繭,終於發現一個明顯的錯誤,如下圖;我們可以發現,原本啟用兩個Instance,應該會出現兩個站台才對,但這邊才出現一個站台。

IIS IP Error

或許這樣感覺不出來,所以我用Azure的VM,建立了一台正常的機器來比對;如以下兩張圖…可以發現到甚麼!?嗯,沒錯,第一個是少了站台,第二個是IP位置不同!!?

IIP IP Correct 1

IIP IP Correct 2

當然,我產生的第一個疑問是,為什麼正常的機器上,IP位置是127.255.0.0和127.255.0.1,後來查了文發現,原來現在的Azure SDK已經改成127.255.0.0和127.255.0.1的方式來區分不同的站台,而非以前用port來區分 ( 據說是1.5就改了,完全沒注意阿= =||| );另外,雖然站台的ip不同,但瀏覽器還是會顯示出127.0.0.1。

當發現這個問題,當然就是又驚又喜,想說已經查出問題,可以解決了,但實際上,根本沒那麼簡單QQ…

找到這個問題後,小弟我第一個想到的就是,既然是IIS Express的問題,那能不能從Visual Studio的建置過程Log,查到一點蛛絲馬跡,結果翻到眼睛快脫窗,終於找到這行,下圖可能沒有全部擷取到畫面,但細節大概是這樣。

Starting process 'C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Windows Azure Tools\v1.8\Debugger\WindowsAzureDebugger.exe' with arguments '"C:\Program Files\IIS Express\iisexpress.exe" /trace:error /config:"C:\Users\San.Sky\AppData\Local\dftmp\Resources\6413450b-a6af-4534-a5ae-9b3775b20072\temp\temp\RoleTemp\applicationHost.config" /site:"deployment18(23).WindowsAzure1.MvcWebRole1_IN_0_Web"'...
'WaIISHost.exe' (Managed (v4.0.30319)): 已載入 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Net.Http\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Net.Http.dll',並略過載入符號。模組已最佳化,並已啟用 [Just My Code] 偵錯工具選項。
Starting process 'C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Windows Azure Tools\v1.8\Debugger\WindowsAzureDebugger.exe' with arguments '"C:\Program Files\IIS Express\iisexpress.exe" /trace:error /config:"C:\Users\San.Sky\AppData\Local\dftmp\Resources\4ef06da0-aee0-46cc-a10b-3fa06f73b6ef\temp\temp\RoleTemp\applicationHost.config" /site:"deployment18(23).WindowsAzure1.MvcWebRole1_IN_1_Web"'...

偵錯

所以可以上面看到,IIS Express的建置指令… ( Orz…也順便把IIS Express的建置過程給學會了… );而也從這邊看到,IIS Express的設定檔位置。

所以繼續追進去,把裡面的一些log看過一遍 ( 眼睛又脫窗了一次… ),這次,終於發現,設定檔有錯誤了!!如下圖。

applicationHost Error

正確的應該是長這樣。

applicationHost Correct

燈燈燈,所以可以發現,是在建置過程中,產生的設定檔發生錯誤;而為了證實,真的是這個設定檔的問題,我還把整個產生出的IIS Express設定拷貝一份,並且重新用IIS Express來Run一次,結果發現是可以的!!

後來我又把錯誤的設定檔用IIS Express跑一次,就產生了IIS Express的錯誤,所以,真正發生錯誤的點就是IIS Express的設定檔,而原因就是因為兩個站台用到同樣的IP和Port!! ( 我要用紅色字,代表我的激動XDD )。

所以我們來整理一下發生錯誤的原因,當Visual Studio開始偵錯的時候,會產生給IIS Express用的兩個設定檔,而不知道甚麼原因,設定檔的內容,都是指向port 81和localhost,所以用一個Instance起得來,但用兩個Instance,就會因為IP和Port相衝,而產生錯誤!!!

好,知道原因後,我懷疑是不是Azure SDK封裝Cloud Service的問題,但經過測試,和移到正常的機器測試等等,都沒有問題;所以可想而知!!!!

是的…我卡關了XDDDD

後來也是過了好幾個月後,問了Michael,後來Michael也查到一些資料,解法是要註冊碼去改值

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\DevDiv\vs\Servicing\10.0\SP的值改為10。

如下圖。

image

改完後,很神奇的,就沒發生了…,就這樣,雖然不知道原因,但至少解決了多年的困擾…

後記

後面連結,有給一些國外針對此問題的解法和看法,還有整個Azure模擬器的建置過程( 我還沒看就是了XDD,有空再來補成一篇 );當然,這個問題,有可能歸咎於小弟我安裝了過太多的Azure SDK,或是裝來裝去,裝了一堆的CTP、Beta、等等開發中版本,才發生這樣的問題,但這個過程還是滿有趣的,所以也在這邊記錄下來。

最後,過了半年,很多朋友也覺得我很神奇XDD,案發現場能保留那麼久…但說真的,我相信只要不放棄,就一定可以找到原因 ( 至少是解法~~ ),所以,如果有發現問題,也不要輕易放棄喔!! ( 其實是我懶得重灌= =… )

參考網址

SQL Server - 安裝StreamInsight 2.1

$
0
0

這幾天,因為公司的需求,所以研究了這一個國內極度冷門,而且還不是我領域的東西…( SQL Server領域…),不過雖然是屬於SQL Server領域,但這個東西還是屬於程式開發者的東西,所以公司非常的看重(!?)我的情況下,就把這個case丟給我了…,所以就順便紀錄一下。

對於StreamInsight有興趣的朋友,也可以參考官網

在開始前,小弟我先付上一張MSDN官網提供的架構圖,好的,我相信只有圖的狀況下,大家應該還是看不懂XDD,其實StreamInsight這個東西很簡單,就是一個input和一個ouput;而透過input來輸入不同的數據,經過中間的處理後,ouput成有用的東西!!

好,我相信以上解釋得很爛,所以舉個例子吧,比如有一個Azure的Server ( 硬要扯到Azure XDD ),我們要去監控目前的CPU使用率,當超過80%的時候,就Alert通知管理者。

CEP 的架構概觀

所以如上圖,我們的Input(左邊),可能就透過Azure提供的cpu數據,不間斷的每秒送出資料到StreamInsight(中間),而中間經過Linq的處理(是的,就是透過Linq來將資料處理),就可以把超過80%使用率的資料,送到管理者(右邊,可能存到db,或是寫到log檔)。

當然,這樣其實也沒甚麼,但StreamInsight真正神奇的地方是,輸入的資料是經過處理的,所以我們可以利用StreamInsight來取得五秒內cpu平均是多少,或是5秒內最高的使用率是多少(使用Linq去做篩選與計算),而最後,吐出這些資料!!

神奇嗎??但這篇不會提到怎麼寫這個程式…這篇只會提到安裝,所以有興趣的朋友們可以先參考官網,其實滿簡單的。

聽完心癢癢後,想要使用StreamInsight!?,但要注意的是,你必須要有SQL Server的金鑰,不然只能使用180天,而比較特別的是,雖然需要金鑰,但SQL Server 2012 執行個體是不需要安裝在電腦上。

如果有興趣,就去這裡下載吧!!

下載有分Client和Server端,我們當然是先下載Server端。

image

然後就一步一步安裝了~~

image

安裝到一半,就會出現讓人不知所措的畫面…Orz…其實StreamInsight 允許在同一部電腦上安裝多個版本。

而用來區分的方式,就是執行個體的名稱,最特別的是, 每個安裝的版本也都支援多個執行個體。

版本和執行個體名稱都是用來識別每個 StreamInsight 執行個體的安裝目錄和登錄機碼。當您連接到 StreamInsight 伺服器時,也必須提供執行個體名稱。

所以,這邊要輸入一下執行個體名稱。

image

接下來,請翻出SQL Server的金鑰吧~~

image

接下來,我們要勾選以下兩個,剛勾選使用Windows服務的時候,預設會使用 Windows NetworkService 帳戶當做此服務的登入帳戶,當然,之後也可以自己去改;第二我們要把目前使用者加入到StreamInsight User群組(真實的群組為StreamInsightUsers$MyInstance MyInstance為剛剛給的實體名稱。),這樣這個群組中的使用者才可以連接到發行的 StreamInsight 伺服器。

image

然後就開始安裝了。

image

基本上,安裝的速度,絕對比小弟我重新下載SQL Server的iso,去尋找金鑰的時間還來的快…,但安裝完後,目前StreamInsight需要使用到SQL Compact Edition 3.5來當作中繼資料存放區,所以還要安裝一下SQL Compact Edition 3.5 sp2。

image

至於這個東西要去哪裡找呢?其實安裝玩StreamInsight時,就會自動地把msi也準備好了,大家可以到C:\Program Files\Microsoft StreamInsight 2.1\Redist找到msi,不過比較詭異的是,要安裝x64..還要先安裝x86版本- -…

另外,內附的版本是英文版,不過目前也幾乎沒用到SQL CE了,所以我也懶得特別去找中文版…

image

於是,我們先安裝x86版本…

image

接下來安裝x64版本…

image

到這邊,就算完成了!!

後記

很抱歉,最近真的忙到翻掉,所以沒空把這個範例在整理上來,如果對此有興趣的人,可以去參考官網,目前都有中文的喔。

參考資料

Windows Azure - 在Web Site下使用Azure SQL Database來存放Session

$
0
0

很早就想把這篇補齊,但一直沒機會,剛好最近,因為要講課,所以就順便把這篇給補起來,這樣大家如果要查詢,就比較方便…

相信如果有讀過這篇( p.s 現在官方強烈建議,不要再用Azure Storage當Cache了),那可能會知道,不管是Cloud Service或是Web Site,前面都會有用到Load Balance,當然,如果後面只有一個站台,那就沒甚麼差,但如果後面有兩台以上的站台來分流,那Session的議題就變得很重要了…

而Cloud Service很佛心的準備了內建Cache來解決這部分的問題 ( 不然用Azure Cache會貴森森… ),那Web Site呢!?其實除了貴森森的Azure Cache外,還有大家常知的…沒錯!!就是使用SQL Server來存放Session!!

當然,我們不會傻傻的Web放到Azure上,但卻把Session放在陸地上…所以,這篇的目的,就是要介紹,如何使用Azure的SQL Database來存放Session!! ( 嗯,或許大家會擔心效能上的問題,但根據可靠情報指出,目前Azure 上的SQL Database都是用SSD喔!! )

( 這篇原文出處於http://blogs.msdn.com/b/sqlazure/archive/2010/08/04/10046103.aspx )

準備SQL Database

首先,我們當然要先去SQL Database來開一個新的SQL Server,這邊我們是要測試,所以很快的快速創建就好。

image

接下來,我們直接進入管理的畫面吧;這邊要特別特別注意,我們要從SQL Database( SQL 數據庫 )這邊點下去,然後選擇服務器那邊的超連結。這樣做的原因很簡單,因為我們等下要在Master資料庫進行作業,所以如果點了前面的ASPNETSessionTest資料庫,那等下進入管理的介面,就會無法使用轉移到Master進行管理,所以我們要從Server的地方連進去。

image

接下來,選擇管理。(大家可以發現,這邊選的就不是什麼ASPNETSessionTest了,而是整台伺服器的名稱 )

image

預設SQL Database的防火牆是沒開放的,所以這邊要允許通過。

image

接下來,輸入帳號密碼,資料庫的部分可以空白不選。( 感謝好友Terry提醒~ )

image

如果是以前,我們在陸地上的時代,我們可能可以使用ASP.NET提供的ASPStateInstall.sql來建立ASPState,但在Azure的SQL Database,則沒那麼容易,因為SQL Database有許多的權限是不可以執行的,所以如果用原本的作法,會碰到釘子,所以我們要利用官方提供給我們的,修改過的版本。

下載位置在這邊

然後,我們就可以利用下載下來的這兩個sql,來建立必要的東西。

建立

當進入管理介面的時候,我們就可以點選選取資料庫。

image

我們這邊先使用master。

image

之後,我們選擇開啟,然後就可以選擇剛剛下載下來後的其中一個檔案ASPStateInstall.sql。

image

打開後,其實也就只有這樣,但不管怎樣,我們還是執行吧。

image

執行完成後,我們要切換到剛剛建立好的這個db (ASPState)。選擇資料庫後,就可以找到ASPState,然後點一下後,就會出現小圖可以選,選擇"摘要"後,就可以進去管理。

image

這邊的步驟,就和之前的一樣了。只是這次選擇了InstallSqlState.sql。

image

這次的東西就很多了,一樣按下執行。

image

到這邊,SQL Database就準備妥當了。

ASP.NET的修改( MVC同 )

其實修改非常的簡單…如下圖,只需要到Web.Config裡面的SessionState那邊,改成SQL Server的設定就可以了。

( 如果Web.Config沒看到SessionState,可以安裝ASP.NET Universal Providers,但查詢的時候可能會找到ASP.NET Universal Providers Core,其實Core是ASP.NET Universal Providers的底層核心,當安裝ASP.NET Universal Providers的時候,就會順便把ASP.NET Universal Providers Core裝起來,並且順便修改Web.Config;但如果直接裝Core,則不會協助幫忙修改Web.Config,變成要自己在Web.Config加上後面的那段程式碼。 )

image

這邊貼上原始碼,方便大家複製貼上。

<sessionState mode="SQLServer"
    sqlConnectionString="Server=tcp:klm4dkemn2.database.windows.net,1433;Database=ASPState;User ID=sky@klm4dkemn2
    ;Password=P@ssw0rd;Trusted_Connection=False;Encrypt=True;"
    cookieless="false" timeout="20" allowCustomSqlDatabase="true" />

完成後,我們就可以用一些瀏覽器的工具,來查看Cookie裡面紀錄的Session ID。

image

透過我們建立起來的ASPSTATE這個資料庫,我們也可以從裡面看到,已經有對應的SessionID了,所以可以確定,這樣就已經把SESSION存放到DB裡面去了。

image

這樣就完成了~

後記

現在透過Web Site,其實整個機制就和一般使用IIS一樣的方便,而且Azure DB的效能也好很多,有興趣的朋友可以試驗看看喔!!

參考資料

Visual Studio - 將Source Code簽入到Git ( Local篇 )

$
0
0

隨著時代的進步,Source Code已經不再是存放到硬碟這樣的單純;要如何返回到前一個版本,如何從改爛的Code裡面救回來,就變成一個很重要的課題。

早期,除了小烏龜外,還有整個超完善的TFS,而隨著時代的演進,Git的地位也越來越重,更是Open Source屆的首席版控軟體,而隨著Visual Studio的進化,到了UPDATE 2後,更Visual Studio也開始支援Git了!!

當然,開始之前,要先升級到Visual Studio 2012 Update 2,然後再去下面著個網址下載Visual Studio Tools for Git。

(補充:這邊只安裝了Visual Studio的接口,讓Visual Studio去控制Git命令,但如果Local沒有裝Git,則還是會沒辦法運作,有興趣的人,可以直接裝GitHub for Windows或是 Gir for Windows)

http://visualstudiogallery.msdn.microsoft.com/abafc7d6-dcaa-40f4-8a5e-d6724bdb980c

image

如果懶得打網址,也可以從Visual Studio的擴充功能中找到。

image

但不管是怎樣找到,基本上還是會下載一個Microsoft.TeamFoundation.Git.Provider.msi檔案,當然,我們只要按兩下就可以開始安裝了。

image

然後急速的安裝,這樣就完成了。

開始本地端的簽入

在開始前,要先提醒一下大家,Git的版控機制和TFS是有點差異的。Git是分散式的版控,簡單來說,版控系統無所不在!!,我們在Local會有一套版控系統,我們會把Code簽入到Local端,也就是說,本機上面就有版本控制的功能,而當撰寫得差不多時,再同步到遠端( 例如GitHub上,GitHub也是每帳號一套和Local架構一樣的版控系統,只是放在GitHub的主機上 ),而這塊就和小烏龜或是TFS有點差異,小烏龜和TFS則必須要連線後( 也就是集中式的 ),才能進行版本控制的簽入動作;但Git則是分散式的。

所以我們可以想成這樣,利用Git可以在本地端進行簽入簽出,當完成後,在同步一份GitHub,而TFS和小烏龜,則必須要連線到Server後才能簽入簽出。

了解之後,我們就試著把第一個專案,簽入到Local的Git裡。

我們首先先開啟一個舊的專案 ( 也可以建立一個新的專案 ),然後從方案總管那邊,準備把整個方案加入至原始檔控制。

image

接下來,因為我們要使用Git,所以要選擇Git。

image

很快的Git Repository就已經建立完成了 ( 這裡的Repository指的是Git存放的地方,通常簡稱Repo )。

image

接下來,我們一樣可以從方案總管找到Commit的選項,按下去後,就可以順利簽入到Local端的版本控制。

image

接下來,就會跳到Team Explorer視窗,我們可以輸入一下註解,並且在Included Changes這邊確認,那些要簽入,如果有不要簽入的檔案,例如Packages整個目錄,就可以從Included Changes的視窗拖到Excluded Changes那邊。( 不簽入Packages的原因是因為使用了NuGet的自動還原機制,所以Packages就不用刻意簽入了,此外,如果有類似bin的目錄,也記住不要簽入喔。 )最後,按下Commit就可以順利簽入了。

image

完成後,就和一般的TFS圖示沒兩樣了。

image

到這邊,本地端的簽入就算完成了!!

我們下一篇,開始介紹,如何同步到遠端!!

後記

整個Git的架構和一般的TFS還有小烏龜是完全不同的,所以在使用上,雖然有UI的協助,但還是建議去看看指令的操作,這樣會比較容易了解整個架構喔!!

參考資料

Viewing all 144 articles
Browse latest View live