2014年8月24日

Azure - Application Insights

其實寫這篇之前,真的想小小抱怨一下,大家就稍微聽小弟發個牢騷吧QQ…

其實在Visual Studio Online推出Application Insights的時候,小弟就已經把圖片都整理好了,只是內文沒時間寫,後來小小的改版,圖也重新弄了一下,但那時候發現Application Insights Tools有一個Bug;那個Bug就是"如果你在Visual Studio裡面使用Application Insights註冊後,並簽入版控,別人取出來後,可以輕鬆地透過Visual Studio來進入擁有者的Visual Studio,換言之,就是擁有了Visual Studio Online的管理權限;也因此,小弟又把這篇文章給保留了…

直到Visual Studio 2013 Updata 3出了之後,基本上這個問題解決了…但整個部屬給我改到Azure去了…Orz… ( 雖說也是小弟的領域啦… )

但是…圖…整個要重弄了,整個要重弄了,整個要重弄了…

其次,佈署到Azure的Application Insights,和Visual Studio Online裡面的Application Insights是串不起來的!!!!換言之就是說,你可以在Azure看到Application Insights的資訊,但是Visual Studio Online裡面看不到!!

於是,又花了快一個禮拜的時間,斷斷續續地找資料。

結果在MSDN看到這段…

Application Insights is moving! For a while, there will be two versions:

We’re gradually building up features in the new version, and are doing no new development on the old one.

你整個搬家到Azure是沒關係啦…但你至少要在Visual Studio Online上講一下吧QQ….

唉,所以結論,小弟這邊就不介紹Visual Studio Online的部分了,直接看Azure上的Application Insights吧…( 下圖是 Visual Studio Online的畫面,就當作紀念留下吧… )

image

正文開始

上面抱怨完了,正文開始…Application Insights是Visual Studio Online很強的一個力作( 但目前被歸類到Azure上 ),他可以讓我們不用做啥事情(頂多設定),就可以快速的收集Server上的資料、使用者的狀況等資訊,例如:使用者用了哪些瀏覽器、看了那些網頁,這些類似Google分析的事情;但除此之外,他還支援了Server層級的訊息,例如:最長的反應時間、請求與錯誤訊息、還可以設定檢查,檢查網站是否活著!!

安裝與使用 – 在應用程式啟用Application Insights

如果是剛開始建立應用程式的情況,那我們可以直接勾選下圖的位置;但小弟我相信,這個情況通常不高XDD

image

通常我們都是已經有應用程式了;所以這邊,我們只要有安裝Visual Studio Updata 3,那就可以透過下圖的位置,輕易地安裝。

image

接下來,要使用Azure的帳號進行登入,如果這個應用程式已經在Azure上了,那可以選擇現有的Application Insights資源,因為現在建立新的Website,都會自己幫你建立一組…( 還好現在不收錢… )。

但如果還沒有在Azure建立過Website,或是沒打算佈署到Azure,只想使用Azure上的Application Insights,就可以使用新的Application Insights資源。

image

此外,如果要自己定義Resource Group,或是等資訊,可以先在Azure建立好Application Insights,然後再回到Visual Studio裡面進行輸入,也是可以的 ( 如下圖 ),這個步驟,小弟就不做了喔~

image

完成之後,會出現如下的檔案。

image

其實NuGet也自動的幫我們加了一些東西,如果未來不想監控了,也可以移除。

image

完成之後,我們其實啟動偵錯模式,他就會幫我們把訊息送到雲端上了喔!!!

image

這時候我們開啟Azure,其實就可以看到,已經把資料傳上來了,第一次的回應時間真久阿XDD

image

而且,如果Server有執行錯誤,也會被Application Insights吃到!!,只是現在Azure還不支援詳細的錯誤訊息… ( 未來會有,目前寫著Coming Soon… )

image

另外,大家可能會想到一件事情,那我這樣子,不是每次開發的時候,都會把錯誤等資訊往上面丟嗎!!?

其實在ApplicationInsight.config檔案裡面可以進行設定,只要把下面那行改為false,就不會把資訊往上丟了;而真正佈署的時候,再改成true就可以了。

    <!--
      DeveloperMode setting controls Application Insights SDK behavior to optimize for local debugging. 
      This setting should be set to false before deploying your application.
    -->
    <DeveloperMode>true</DeveloperMode>

基本上,這樣基礎的功能就完成了,但還有兩個東西需要設定,才會得到更詳細的訊息。

建立Reponse測試

我們這邊可以建立Reponse測試來測試網站是否活著;如下圖。

除了測試名稱外,基本上我們也要給他一個URL;然後選擇要從哪邊發出測試;也可以自己定義成功的條件,還有是否要收到通知等相關項目。

image

加入使用者分析

除此之外,我們也希望能看到使用者的分析(類似Google分析),而要加入使用者分析,就必須加入JS,到你的應用程式裡面了,做法如下圖。

image

是的,就是底下那些JS Code,把它複製到HTML的head裡面就可以了。

image

基本上,就這些嚕

參考資料

Azure - Website Web Hosting Plans

Web hosting plans (WHPs),也是新Portal才出現的名詞 ( 現在是怎樣= =..新Portal一出,一堆名詞通通跑出來… ),但這個觀念,其實以前就有…Web Hosting Plans主要是用在Website上,大家不知道還不記得,Website有個很便宜的特性,那就是你租用一個Website後,其實是可以放500個網站,而只要算一個的錢 ( Cloud Service表示 : …… ),而其實這個背後的概念,就是Web Hosting Plans。

網絡託管計劃(WHPs)其實就是代表一組功能和能力,而這一組(可以想成一台機器)的資源,就可以讓你的網站共享與使用;所以其實Website上的價位,算的就是WHPs的錢~~

所以這樣看完上面的解說,大家應該就通了吧~簡單的說,我們付Website的錢,就是租一台Server ( 嚴格來說,並不一定會等於一台,因為你可以在一個WHPs裡面有多個Instance,只是為了方便解釋,我們用一台來解說 ),而這台Server,官方就用比較好聽一點的名詞,稱為WHPs。

也因此,這個WHPs裏面上的所有Website,基本上都是共享同一個Resource Group、地理位置和你的Azure帳號~

當然,這又就有好處,也有壞處嚕,以壞處來說,就是整個就被綁住… ( 畢竟是同一台Server嘛… )至於好處…如果Web Hosting Plans有設定兩台Instance,那全部的網站,都會支援LB架構… ( 但如果裡面有些網站的Code沒有針對LB撰寫的話…就GG了… )

Resource Group、WHPs、Website

三者的關係就如同下圖,你每一個Website基本上會在WHPs裡面,而WHPs則會在Resource Group裡面。關於Resource Group,可以參考小弟的這篇

Resource Groups and Web Hosting Plans

建立新的Web Hosting Plan

我們可以建立新的Website時,選擇建立新的Web Hosting Plan,或是沿用現有的;而如果選擇現有的,則Resource Group會自動改成現有的Web Hosing Plan所屬的Resource Group。

另外要注意的是,你沒辦法建立空的Web Hosting Plan。

image

Website搬移Web Hosting Plan

Website的搬移,其實也有相關限制。

  • 在不同Resource Group底下的Web Hosting Plan不能搬移
    例如有兩個Resource Group A和Resource Group B,而這兩個Resource Group底下各自有兩個WHP A和WHP B,那屬於WHP A底下的site A是不能搬到WHP B底下的。
  • 同一個Resource Group,但底下的Web Hosting Plan在不同地區,也不能搬移
    例如有WHP A和WHP B,但WHP A在東亞,WHP B在東美,那WHP A底下的site A是不能搬到WHP B底下的。
  • 同一個Resource Group,但底下的Web Hosting Plan在相同區域,則可以搬移

至於未來會不會改,就看MS的規定吧;搬移的方式如下圖。

image

基本上就這樣嚕~@@~

參考資料

Azure - Resource Group

如果有使用Azure新Portal的朋友,可能會發現"同質群組"這個東西不見了,反而出現一個以前從沒看過的新名詞"Resource Group"…

至於Resource Group是不是取代了同質群組,或是同質群組的強化版?,官方沒有明確的說 ( 也或許小弟沒看到.. ,但至少官方的定義不一樣,有可能Resource Group內含了同質群組的效果 ),但不管怎樣,我們先來看看甚麼是Resource Group吧~~

資源邊界

嗯,不是明日邊界,是資源邊界…在官方的官方文件裡面有提到,早期我們管理Azure資源,其實是一件非常麻煩( 其實小弟我覺得還好耶… )的事情…麻煩的原因是因為資源四處飛散;例如一個網站,可能會有DB、Web Site、Storage、AD、Cache等等等。

所以官方為了讓這些資源容易管理,就畫出了一個資源邊界,表示這個邊界內的東西,都屬於同一類;而這東西就稱為Resource Group,也可以稱為這些資源的生命週期;例如說,Study4的Resource Group;當Study4還存活著的時候,裡面的東西(例如DB、WebSIte)幾乎都還會用到;但如果Study4倒了…那要砍的時候,基本上就是全部一起砍了…而Resource Group就可以做到這種事情~故.官方也稱為這是這些資源的生命週期。

建立Resource Group

其實Resource Group不能獨立建立( 至少小弟沒找到… ),要建立Resource Group通常是要建立某個資源的時候,可以選擇使用新的Resource Group,或是使用現有的Resource Group。

例如下圖,我們要建立新的Website的時候,可以選擇使用現有的Resource Group,或是建立新的Resource Group;另外,如果是在以前的Protal建立的東西,其實也會在新的Portal呈現出來他的Resource Group;例如以前我有建立Virtual Network,那他也會自動建一個叫做Default-Networking的Resource Group,只是以前的Portal看不見罷了…

image

瀏覽Resource Group

就像下圖般,我們可以瀏覽目前所有的Resource Group,而且也可以透過Resource Group來查看這個Group底下的一些相關資訊與報告。

image

增加資源與刪除Resource Group

除此之外,我們可以透過下圖的這個按鈕來新增新的資源到這個資源群組裡。

另外,官方也有提到,官方不建議將Azure資源放到Team Project的資源組裡面… ( Visual Studio Online目前預設都會放在另外一個Resource Group )

image

我們也可以透過下圖的位置,直接刪除整個Resource Group。

image

參考資料

Azure - 儲存Session到Redis Cache

上一篇,我們快速地看到了Redis怎麼樣在Azure建立與使用,那同樣的,在Azure上,多個Instance最需要解決的還是Session問題;我們以前看了很多種解決方式,例如官方不建議的Table方式,或是早期的存放到SQL Database、貴貴的Azure Cache,或是拿Cloud Service的Work Role當作Cache。

而這篇文章,我們就來看看,要怎樣使用超高速的Redis Cache當作Session的存放位置。

首先,我們要在NuGet裝RedisSessionStateProvider,所以我們要在搜尋方塊打"RedisSessionStateProvider”。( 目前這個Lib是屬於發行前版本,所以要切換到發行前版本進行搜尋才搜尋的到 )

image

完成之後,官方是寫說會將Lib載入,並且自動修改Web.config,但實際上,我沒有阿QQ..好啦,這個月人品持續有問題,那我們也只好自己加入了…下面是官方給的範例,我們就用這範例去做調整吧。

基本上,只有retryTimeoutInMilliseconds要注意一下,因為是以毫秒為單位計算。( RetryTimeoutInMilliseconds是當有斷線,連不到的情況下,可以重試 )

<sessionState mode="Custom" customProvider="MySessionStateStore">
  <providers>
    <!--
      <add name="MySessionStateStore" 
        host = "127.0.0.1" [String]
        port = "" [number]
        accessKey = "" [String]
        ssl = "false" [true|false]
        throwOnError = "true" [true|false]
        retryTimeoutInMilliseconds = "0" [number]
      />
    -->
    <add name="MySessionStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider" host="127.0.0.1" accessKey="" ssl="false" />
  </providers>
</sessionState>

那我們修改玩的Web.Config會長得像這樣,記得accessKey要填入Azure上Redis Cache的Key。

<?xml version="1.0" encoding="utf-8"?>
<!--
  如需如何設定 ASP.NET 應用程式的詳細資訊,請瀏覽
  http://go.microsoft.com/fwlink/?LinkId=301880
  -->
<configuration>
  <appSettings>
    <add key="webpages:Version" value="3.0.0.0"/>
    <add key="webpages:Enabled" value="false"/>
    <add key="ClientValidationEnabled" value="true"/>
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5"/>
    <httpRuntime targetFramework="4.5"/>

    <sessionState mode="Custom" customProvider="MySessionStateStore">
      <providers>
        <!--
      <add name="MySessionStateStore" 
        host = "127.0.0.1" [String]
        port = "" [number]
        accessKey = "" [String]
        ssl = "false" [true|false]
        throwOnError = "true" [true|false]
        retryTimeoutInMilliseconds = "0" [number]
      />
    -->
        <add name="MySessionStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider" 
             host="skyrediscache.redis.cache.windows.net"
        accessKey="..." ssl="true" />
      </providers>
    </sessionState>

  </system.web>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed"/>
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-1.5.2.14234" newVersion="1.5.2.14234"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-5.2.0.0" newVersion="5.2.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

最後,我們可以寫一個Session進去看看。

public ActionResult SessionTest()
{
    Session["Test"] = "Hello Redis";

    return View();
}

基本上如果無報錯的話,就代表成功了喔!!

參考資料

Azure - Redis Cache

在Open Source裡面,Redis其實算是非常紅的NOSQL資料庫,尤其是他的速度非常快(因為都存在Memory裡面),所以大家通常都會把Redis當作Cache使用。

( 這裡有簡體的Redis 設計與實踐手冊,有興趣的朋友可以看看,小弟是還沒空看就是了… )

而近年來,不斷改變形象的MS,現在Azure上,也幫我們實作了以Redis為核心的Cache,讓我們可以不用建立,立馬可以使用!!

除此之外,官方的Blog文章也指出,"微軟公司建議 Azure 用戶所有的新開發的應用系統,未來皆採用 Azure Redis Cache",所以可以看的出來Redis Cache已經取代了原先的Cache機制了…

另外,這邊也有"早期"的Redis Cache vs AppFabric的效能比較資訊,不過這種資訊參考參考就好,畢竟時代不斷的進步~

那接下來這篇,我們就來介紹一下Azure上的Redis Cache。

Create a cache

首先,我們當然是要建立Redis Cache,而在寫這篇文章的時候,還是Prieview,所以要用於正式環境的朋友,要注意一下喔!~要啟用Redis Cache,必須於新版的Azure Portal上,才可以看見,所以大家記得切換到新版的Portal上喔!~

要建立很簡單,只要選擇Redis Cache就可以了。

image

然後我們要輸入一下DNS的位置;然後依據你想要使用的大小,選擇方案,基本上目前Redis Cache有兩種方案,一種是Basic,一種是Standard;Basic比較便宜,但是不保證SLA 99.95,而Standard基本上都有SLA 99.95 ( 詳細資訊可以參考官網 )。

另外,如果不滿1G,通常都會和別人共用,所以如果想獨享,那就要選1G以上方案 ( 好像在講手機4G行動方案的感覺= =|| )

接下來要選擇Resource Group、要使用的帳號、和地區。

image

完成之後,就可以等他建立完成;完成之後,我們就可以從下圖的位置取得密碼等資訊。

image

到這邊,就建立完成了!!

Application

應用程式這邊,則要使用第三方套件,才能對Redis Cache進行操作;我們可以使用NuGet打"StackExchange.Redis"取得,如下圖。而這邊,兩個套件選擇其中一個就可以;如果你喜歡Strong-Name,那可以選擇第二個。( 關於Strong-Name,有興趣的朋友可以Google ),另外,要注意的是目前這個Lib只支援.Net Framework 4以上版本。

image

接下來就是寫Code了!!~,基本上我們這邊會有三個簡單的Demo;首先我們會使用ConnectionMultiplexer.Connect來設定連線字串;如果不想要SSL,可以把SSL設為False;而後面的Password就是我們上面所看到的Key。

另外,官方網站有特別提到,ConnectionMultiplexer.Connect只需要設定一次,就可以給你的這個應用程式使用,如果設定多次,可能會有效能下降的疑慮。接下來,我們可以使用connection.GetDatabase()來取得IDatabase的實體,到時候我們就可以使用這個Object來操作Redis Cache。

我們要存放資料很簡單,只需要下cache.StringSet("Key1", "value");,而不需要在下啥SaveChange等指令…;Redis裡面存的是Key、Value,而這個Value基本上是文字;但我們也可以把二進位元碼存、C# Object存進去;只是要稍微轉換一下就是了。

要取出來也很簡單;我們可以用StringGet(“Key1”)來把資料放到MVC的ViewData裡面;而如果裡面沒有東西,則會回傳Null,所以透過此機制,我們可以很簡單的實作出Cache-Aside Pattern ( 如Demo-2 )

最後,如果有需要,也可以設定過期時間,如Demo-3。

using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace RedisCacheDemo.Controllers
{
    public class HomeController : Controller
    {
        // GET: Home
        public ActionResult Index()
        {
            //設定連線字串
            ConnectionMultiplexer connection = 
                ConnectionMultiplexer.Connect(
                "skyrediscache.redis.cache.windows.net,ssl=true,password=....");
            
            IDatabase cache = connection.GetDatabase();

            //Demo-1 存放簡單的形態到Cache
            cache.StringSet("key1", "value");
            cache.StringSet("key2", 25);

            //取得資料
            ViewData["key1"] = cache.StringGet("key1");
            ViewData["key2"] = (int)cache.StringGet("key2");


            //Demo-2 Cache-Aside Pattern
            string value = cache.StringGet("key1");
            if (value == null)
            {
                //如果找不到資料,就從資料庫取得
                value = GetValueFromDataSource();

                cache.StringSet("key1", value);
            }

            //Demo-3 指定時間
            cache.StringSet("key1", "value1", TimeSpan.FromMinutes(90));

            return View();
        }
    }
}

基本上這部份的操作就是這樣,還滿簡單的;下一篇,我們來看看,如何將Session存放到Redis Cache裡面去。

參考資料

2014年8月21日

Entity Framework - 為什麼修改的資料不用Attach

這幾天在上MVC的課程,有一個同學問到一個很不錯的問題,這個問題大致上是這樣的.

為什麼ASP.NET MVC的範例,修改資料的時候,不需要Attach??

程式碼在下面

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "Id,FirstName,LastName")] Emp emp)
{
    if (ModelState.IsValid)
    {
        db.Entry(emp).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
return View(emp);
}

其實這個問題,很久以前有研究過,但後來並沒有寫到Blog上,所以也忘記了…而基本上,上面的程式碼,是從ASP.NET MVC範本出來的,大家可以看到,只要Emp這個物件傳進來之後,並且把Emp塞到db.Entty()裡面,在改State成Modified後,就可以了。完全不用Attach!!

但是不用Attach,DBContext怎麼會知道我們要更新甚麼東西呢??

其實我們去看MSDN的文件,官方也這樣寫的;如果你有一個Entity,並且你已經知道它存在於資料庫,但這個Entity裡面的東西已經被改變,那你可以告訴DBContext要Attach,並且將狀態設為Modified!!,如下程式碼。

var existingBlog = new Blog { BlogId = 1, Name = "ADO.NET Blog" }; 
 
using (var context = new BloggingContext()) 
{ 
    context.Entry(existingBlog).State = EntityState.Modified; 
 
    // Do some more work...  
 
    context.SaveChanges(); 
}

等等,我們還是沒看到Attach阿!!?…

理論上應該如這篇文章的內容一樣,是這樣這寫吧??..我們應該先Attach這個物件,然後再把State改為Modified…那為什麼上面的範例不用??

db.Users.Attach(updatedUser);
db.Entry(updatedUser).State = EntityState.Modified;
db.SaveChanges();

其實原因很簡單,那是因為背後他幫我們自動Attach了,所以我們就可以不用Attach了…

那是在db.Entry()這個方法裡面進行Attach的嗎??…

錯…我們可以看到下圖;當我們執行完db.Entry()後,根本就還沒開始追蹤,甚至現有物件和原始物件都還是沒東西的狀況…

image

那到底在哪邊?

答案就在這一行,真正會自動幫忙Attach的地點其實是在設定State的這個地方…

dbEntry.State = EntityState.Modified;

其實我們反組譯看看,就可以看到如下圖。

image

是的,其實在我們設定State的時候,會用到set,所以真正的自動執行Attach的地方,就是這裡… ( 老實說,真的意想不到阿= =|| )

也因此,我們也不用多寫Attach,只要變更State的時候,他就會自動幫我們Attach去上,並開始追蹤了~~

參考資料

2014年8月7日

ASP.NET MVC - 使用Web Deploy佈署MVC應用程式到IIS

是的!!,大家沒看錯,這篇文章就是要寫很基本到基本不行的基本功;那為啥要寫這篇呢?因為小弟最近都佈署到Azure…久久才佈署一次到IIS上,但每次都會遇到一些小問題(翻),所以為了一勞永逸,就直接把步驟記錄下了來= =…( 不然每次都會忘記東一點,忘記西一點 )

既然如此,我們就開始吧!!首先,我們要先安裝IIS (廢話…)。

image

然後功能這邊,要勾選ASP.NET 4.5!!,因為MVC 5都是拆開成一個又一個的DLL了,所以如果要佈署MVC 5,就直接勾選ASP.NET 4.5就可以了,不用再特別安裝獨立的MVC Package。

image

因為我們會使用Web Deploy佈署,所以要把Management Service勾起來。

image

另外,我們也要在Application Development裡面勾選ASP.NET 4.5,通常勾ASP.NET 4.5,那.NET Extensibility 4.5、ISAPI Extensions、ISAPI Filters都會自動勾起來,另外,如果有使用到SignalR,那要把WebSocket Protocol勾起來喔~當然,其他的Windows驗證等等之類的,就看各位看官的需求了,這邊畢竟是針對Web Deploy和標準的MVC,有需要的朋友,就自行勾選吧。

image

接下來要使用Web Platform來進行安裝Web Deploy,如果是新安裝的OS,進入IIS的時候,他就會問你要不要裝了,然後就會進入Web Platform的官網,這時選擇下載,並且安裝就可以。( p.s 如果IE的安全性沒關掉,不能下載喔…別忘了Win Server的IE預設會開安全性 ),或是進入IIS後,選擇下圖的按鈕也是可以。

image

這邊要裝Web Deploy 3.5、Web Deploy 3.5 without bundled SQL support、Web Deploy 3.5 for Hosting Servers三個套件,除此之外,你也可以直接到Web Deploy的官網下載msi檔案來安裝,我們這邊就先用Web Platform來安裝。( 也有很多文章,是建議直接裝"Recommended Server Configuration For Web Hosting Providers",但那裏面包含了PHP、MySQL等等東西,還要自己取消勾選,所以小弟是直接安裝Web Deploy啦~ )

image

完成後,重新開啟IIS管理介面,就可以看到如下圖位置,多了很多管理的東西~

image

接下來,我們要設定使用權限,通常我們不會使用administrator的權限來進行Deploy,所以在進行下圖這個步驟之前,請自行先去新增一個帳號;新增完畢後,就可以透過下圖的位置,來設定權限。

image

這邊,我們使用skychang這個帳號,到時候在vs裡面,也是用這個帳號進行佈署。

image

接下來,我們要進入到下圖的位置,打開遠端佈署的功能。

image

要Enable,必須先停止後,才能勾選Enable,勾選完後,再啟動就可以了。

image

接下來,我們要設定佈署的相關資訊,簡單的說,就是設定skychang擁有web目錄下的權限。(這樣才能塞網頁上去嘛~ )

image

這邊我們選則剛剛設定的帳號,然後按下setup,就會開始設定目錄的權限了~

image

到這邊,其實還沒結束,也別忘記要把port 8172打開。

image

另外,我們也順便從啟動服務這邊,看看Web Deployment Agent Service、Web Management Service啟動了沒。

image

都完成之後,就回到Visual Studio裡面,設定發行;通常伺服器,用ip比較方便,他會自己去尋找Web Deploy的位置;網站名稱如果有需要,可以在Default Web Site後面再加上Application Name,例如Default Web Site\MyApp;目的地URL,就是你佈署完之後,你這邊會用瀏覽器打開的URL。

image

正常情況下,驗證連線就可以通過了,但今天不知道為啥,遇到了404錯誤,通常遇到這個錯誤,是因為Web Deploy沒有啟動監聽處理,也就是說Web Deploy的安裝沒安裝好,所以我們可以進Web Deploy的網站下,下載安裝檔;記住,如下圖,全部都要勾選。

image

另外,今天也有遇到一個小問題,是Microsoft.Web.Infrastructure錯誤,這種錯誤通常都是因為使用到Windows Server上的GAC;解決方式很簡單;基本上,回到我們專案上,看一下Infrastructure這個DLL的路徑,是使用到下載NuGet的Package,還是參考到GAC路徑;如果是參考到GAC,大家可以參考這篇,或是參考饅頭這篇解法;如果是參考NuGet下載下來的路徑,那只要把複製到本機這個false改成True;到時候就會把這個dll給傳上去了。

image

通常這樣應該就都會成功了!!~你的MVC 5應用程式,就可以順利佈署上去了~

參考資料

2014年8月1日

GitHub - 在本地端建立Jekyll Server以利測試Blog文章

前面幾篇,我們介紹了使用Jekyll Bootstrap來當作樣板,並發佈到GitHub Page上,但總不可能每次改一個東西,就發佈到GitHub上來驗證吧!? ( 嗯,也不是說不能啦XDD ),所以網路上幾乎都會介紹到,如何在本地端建立Jekyll Server,來搭配使用;建立完後,我們就可以利用本地端Jekyll Server來測試看看有無錯誤,如無錯誤,在sync到GitHub上面去。

首先,因為Jekyll是使用Ruby寫的,我們需要下載RubyInstaller ( Ruby在Windows的安裝工具 ),如下圖。

image_thumb1

那小弟這邊是選擇x64版本。

image_thumb4[1]

以下是安裝畫面,小弟全勾就是了。

image_thumb9[1]

安裝完之後,我們還要安裝DevKit工具。

image_thumb2

DevKit 是windows編譯C/C++的工具包,簡單的說,就是模擬Linux下的make、gcc。通常情況下,我們是可以不需要,但因為等下要搭配Gen,所以就變成必須安裝這個工具包了。

預設是會放在c:\DevKit這個位置。

image_thumb4

完成之後,我們要key下面這個指令

ruby dk.rb init

就會進行初始化設定。

image_thumb6

設定完後,我們要回到ruby200-x64的目錄下,也就是安裝Ruby的目錄下修改config.yml檔案,並且設定我們目前安裝Ruby的路徑;如下圖。

然後輸入

ruby dk.rb install

進行DevKit的安裝。

image_thumb9

接下來是Ruby的Gem工具,這個工具就和MS的NuGet很像,我們可以透過指令的方式,來安裝套件,並且他會自動的處理相依性;下面是RubyGem的官網,但我們不用下載也不用安裝,因為RubyInstaller其實已經包在裡面了。

image_thumb7

接下來,好的習慣,就是要先更新一下,我們可以利用

gem update –system

進行Ruby的更新。

image_thumb12

更新完後,我們也順便把gem更新一下。

gem update

透過此指令來更新。

image_thumb15

都準備好之後,我們就可以使用

gem install jekll

來安裝Jekll了!!

image_thumb18

完成之後,我們就進到你的網站目錄下 ( 以下圖為例,則為study4.github.io這個目錄下 ),輸入

jekyll server

來啟動Server,啟動之後,預設是port 4000,就可以透過瀏覽器看到我們使用Jekyll Bootstrap的畫面了。

image

最後,我們就可以從本機進行修改,確認無誤後,在發行到GitHub上嚕!!

參考資料