2012年4月22日

SQL Azure - 使用SSIS將SQL Azure的資料複製到Local

因為之前資料移到到SQL Azure去了之後,就把整個DB砍掉了,但本地端開發的時候,還是不太可能無時無刻都連著SQL Azure,所以,這次的目的是把SQL Azure的資料庫移回Local,而這次,我們使用簡單好用的SSIS工具,來達成我們這次的任務。

當然,或許SQL Server大師們還有更好的方法也說不定,但小弟畢竟不是SQL Server大師,所以這篇也還是站在紀錄的角度,大家有興趣看看就好=v=;其次,或許有人會說,為何不直接同步!?的確,這也是一個方法,但同步要和SQL Azure同步的SQL Server還沒裝起來阿XDD,而且,這次移動的資料,主要是要放到筆電上面,方便小弟我無聊時,可以躺著開發程式。( 好啦,我承認前面很多都是藉口,其實是因為沒玩過SSIS,也想利用這個機會試試看QQ )

首先,我們當然是要先在Local增加一個資料庫,既然現在最流行的話題是SQL Server 2012,所以我們的SSMS當然也是要用2012版本嚕!

image

下一步,當然是要Key一下資料庫的名稱。

image

接下來,在建立之前,我們要改一下這個資料庫的定序,但我不確定是否要改成SQL_Latin1_General_CP1_CI_AS,但因為目前SQL Azure上面都是使用這個定序,所以為了統一,我就改了。

image

然後,我們選擇建好的DB,並且選匯入資料。

image

鏘鏘!,就會出現SQL Server 匯入和匯出精靈的畫面嚕!

image

接下來,資料來源要選擇.Net Framework Data Provider for SqlServer,並且填入連接字串,這邊的連接字串要注意,看看密碼有沒有打進去。

image

連接字串可從這邊找到,當然,這個畫面有很多不可告人的祕密,所以全被小弟塗白了,另外,因為Silverlight的右鍵是沒有用的,所以可以使用Ctrl+C的方式來複製連線字串,當然,如果全部想要自己打,我也沒意見=V=。

image

然後我們選一下目的的伺服器,和目的的資料庫。

image

當然,這邊就看要傳送那些資料了,因為我是全部都要傳下來,所以這邊我是選擇第一個選項。

image

然後確定一下資訊,我們也可以預覽一下。

image

到這邊,就剩下最後確認了。

image

然後就會開始執行,我們就可以看著綠色圈圈轉啊轉。

image

到這邊,就成嚕!!當然還有其他的方法也可以達成,這篇就給大家當作一個參考吧。

參考資料

http://stackoverflow.com/questions/5475306/copy-sqlazure-database-to-local-development-database

2012年4月21日

Windows Azure - 使用Windows Azure Storage解決Sessios問題

2012/6/16 更新 目前官方已經提出新的Cache來解決Session了,請參考這篇這篇

2012/5/28 更新 根據官方說法,如果使用Table當Sesson,碰上一個Role裡面有多個Web Site時,可會出問題,所以官方建議使用Caching或是SQL Server,是比較建議的做法。

有玩過Windows Azure的人,應該都會知道Web Role可以是多個的 ( 只要口袋夠深 ),就好比下面這張圖 (在微軟的邊做邊學找到的)一樣,我們可以在HTTP的請求進來的時候,利用六台的Web Role來進行服務,這也就是Load Balance的機制。

image

其實Windows Azure這點很棒的,因為我們可以輕鬆地去平衡大量的需求,當流量多的時候,我們就多開幾台Web Role,當人少的時候,我們就少開幾台Web Role!而且我們不需要做任何的事情!

當然,話是這樣說,現實總是比較殘酷一點的,Load Balance機制有一個最大的特點,舉例來說,我們現在有Web RoleA和Web RoleB兩台提供服務,當進入Default.aspx( 首頁 )的時候,可能會在Web RoleA,而點下Login.aspx ( 登入頁面 )的時候,可能是由Web RoleB來提供服務,超酷的吧!!

但問題來了,如果今天在Web RoleB登入,並在Web RoleB利用Session來記錄登入資訊,當下一頁跑到Web RoleA的時候,我相信,客戶就會打電話進來罵了,然後我們就會被老闆罵了…。

會發生這個原因其實很簡單,因為Session通常都記錄在記憶體裡面,而我們登入的資訊記錄在Web RoleB的記憶體上,當下一頁切換到Web RoleA的時候,當然就會找不到內容。

話說回來,我相信如果如果比較大的公司,有導入Load Balance機制的程式開發人員,一定都會針對這方面來,避免使用Session寫程式,或是將資訊寫到資料庫,或是利用Cookie等等的方法,但隨著時代進步,超方便的Windows Azure上市,讓中小企業也可以享受到Load Balance機制,而這時如果舊有的程式,沒有針對Load Balance機制去做設計,然後就發佈到雲端上,就會發生上面所講的問題,被老闆罵了。

( 如果只放一台Web Role,當然就不會有這種問題了。 )

沒圖沒真相

所謂沒圖沒真相,所以小弟我稍微寫了一個超簡單的程式來驗證一下。

小弟我寫了兩頁A.aspx和B.aspx。

image

反正是自己機器上面模擬,就給他開個四台吧。

image

A.aspx的頁面也超級簡單,就放一個Label和一個超連結。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="A.aspx.cs" Inherits="AzureAspNetSession.A" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
        <a href=B.aspx>Go B Page</a>
    </div>
    </form>
</body>
</html>

A.aspx.cs的程式碼也超簡單,但這邊我使用了RoleEnvironment.CurrentRoleInstance.Id來識別目前這台Web Role是哪一台,另外,就是將session存了一個A PageSession的字串。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.WindowsAzure.ServiceRuntime;

namespace AzureAspNetSession
{
    public partial class A : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Label1.Text = RoleEnvironment.CurrentRoleInstance.Id;
            Session.Clear();
            Session["Test"] = "A PageSession";
        }
    }
}

B.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="B.aspx.cs" Inherits="AzureAspNetSession.B" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
        <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>
    </div>
    </form>
</body>
</html>

B.aspx.cs的程式碼也很簡單,如果Session不是空,就Show出來,如果是空,就Show出Session is null,當然,也要把目前是哪一台Web Role Show出來。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.WindowsAzure.ServiceRuntime;

namespace AzureAspNetSession
{
    public partial class B : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Label1.Text = RoleEnvironment.CurrentRoleInstance.Id;
            if(Session["Test"] != null)
            {
                Label2.Text = Session["Test"].ToString();
            }else
            {
                Label2.Text = "Session is null";
            }
        }
    }
}

然後執行看看,我們可以看到,目前是連到第二台Web Role,然後我們按下 Go B Page的超連結。

image

到B.aspx,Session卻是Null!,那是因為我們現在連到第一台。

image

所以,這個實驗可以發現,如果連到別台,Session是真的可能會抓不到,所以建議,如果寫這方面程式的時候,盡量不要用Session。

現實是殘酷的

沒錯,現實是殘酷的,當老闆要求幾天內將程式搬到Windows Azure上去,而且要開兩台以上;但是程式裡面已經一堆Session的時候,該怎麼辦!? ( 實際上可能還會考慮到更多問題,反正這只是一個梗,大家就不要太計較了XDD ),其實還有幾種方法,我們這邊就先使用最簡單的方法吧!也就是將Session存到Windows Azure Storage裡面去。

動手寫程式

我們延續之前的範例,首先,我們要先在Web.Config裡面的System.web下,加上這一串設定。

<?xml version="1.0" encoding="utf-8"?>

<!--
  如需如何設定 ASP.NET 應用程式的詳細資訊,請造訪
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->

<configuration>
    <system.web>
      <compilation debug="true" targetFramework="4.0" />
      <!-- 加入以下 -->
      <sessionState mode="Custom"
                       customProvider="TableStorageSessionStateProvider">
        <providers>
          <clear/>
          <add name="TableStorageSessionStateProvider" 
               type="Microsoft.Samples.ServiceHosting.AspProviders.TableStorageSessionStateProvider"/>
        </providers>
      </sessionState>
      <!-- 到此為止 -->
    </system.web>

</configuration>

接下來,很不幸的,我們必須去下載一個dll,大家可以從這邊下載,這是官網提供的一個範例,內容就是在講如何使用Windows Azure Storage來存Session,下載完後,將之解壓縮,我們就可以看到下有一個C#\AspProviders\bin\Debug\AspProviders.dll檔案,這個檔案就是關鍵,然後我們就可以回到我們的專案,將這個檔案參考進來,參考進來後會如下圖。

image

接下來,點一下AspProviders,然後看一下"複製到本機"是否為True。

image

接下來,我們要設定連線字串,這裡我們使用的是Local的Storage,如果要使用Cloud上的,可以自己在這邊設定,如果不會修改,可以參考這篇

image

設定完後,就可以開始執行看看了,一樣我們先從A.aspx開始。

image

當我們切換到B.aspx時,可以發現,現在在另外一台Web Role上,但是他卻抓的Session了。

image

我們可以從伺服器總管查看Blob和Table,發現,他現在將Session存在這邊了。

image

這樣就完成嚕!!

後記

目前官方並沒有正式提供Library來實作這塊,官方比較建議利用Azure Caching來配合Session或是SQL Server,但不管怎樣,Table至少是最便宜的方法,至於好或不好,就見仁見智嚕。

參考資料

Windows Azure 儲存體 - 設定真實Windows Azure儲存體的連線字串

Davia老師所說,當開始繳錢,使用Windows Azure後,第一個會遇到的問題一定就是連線字串的問題;我們在本機模擬的時候,其實都不會考慮到這些問題,但當程式發佈到雲端後,總不可能還在繼續存取我們本地端的Storage吧,所以我們這時候,就必須設定真正在雲端上的連線字串;老實說,這部分其實也不困難啦,但是有一些梅梅角角的地方,相信有圖好做事,所以就在這邊紀錄一下。

開始設定

首先,我們要先設定連線字串,選擇Azure的服務定義檔 ( 這邊是WebApplicationRole ),然後選擇屬性。

image

接下來,我們就可以看到整個貼心的設定畫面;我們選擇第二個設定,然後"服務組態"的地方,要選擇"所有組態",接下來,再按下加入設定。( 這邊要注意一下,如果服務組態的地方,不是所有組態,那就沒辦法進行加入與移除的動作。 )

image

按下加入設定後,會出現新的設定框,我們先給個好記的名稱,這裡小弟就使用TestConnectionString當名稱吧,然後"類型"要選擇"連線字串",最後再按一下旁邊的"…按鈕"。( 或許有人會想把預設的Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString刪除,但建議不要這麼做,這個連線字串是拿來偵錯使用的。 )

image

然後他會出現儲存體帳戶連接字串對話框,我們要選擇"輸入儲存體帳戶認證",然後Key上"帳戶名稱"和"帳戶金鑰",那這兩個值在哪邊呢,繼續看下去。

image

帳戶金鑰的位置,就從"儲存體帳號",選擇好要"儲存的儲存體",然後右邊會有一個"主要存取金鑰",按下"檢視",就會跳出"檢視儲存體存取金鑰對話框",按下最右邊的"複製按鈕",Silverlight就會幫忙複製起來;而右邊的"名稱",其實就是帳號;我們把這兩個值,填入到上面的對話框,就完成了!

image

讓Local和Azure使用不同的儲存體

聰明的你,一定會發現一件事情!沒錯,現在這樣設定的話,Local測試的時候,也會變成要去存取雲端的Storage,所以我們要再做一個簡單的修改,讓Local和Azure使用相同名稱,但連線內容不同的設定檔。

我們回到剛剛設定連線字串的頁面,這次我們將"服務組態"設定成Local,並且按一下TestConnectionString的"…按鈕"。

image

但我們這次選擇"使用Windows Azure儲存體模擬器",這樣就可以了。

image

我們可以從這兩個檔案來看到設定,其實從名子就可以發現,一個是Cloud,一個是Local。

image

我們先看ServiceConfiguration.Cloud.cscfg,我們可以看到TestConnectionString的設定是Cloud的設定了。( 以下空空,是因為我塗白了.. )

image

如果是ServiceConfiguration.Local.cscfg,則就是預設本機的UseDevelopmentStorage=true的設定,也就是使用本機模擬的Azure Storage。

image

稍微改一下程式吧!

最後一個步驟,就是程式的地方,當然還是要稍微修改一下嚕,以下是片段的程式碼,至於如何存取的議題,可以參考這邊

//如果想使用本地端的Storage Account,而不使用連線字串,可以這樣寫,
//這邊我就註解掉了,因為我們現在要使用連線字串。
//CloudStorageAccount account = CloudStorageAccount.DevelopmentStorageAccount;
//如果是使用連線字串,就可以這樣寫。
CloudStorageAccount account = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("TestConnectionStrting"));

沒錯!這樣就完成了!,有沒有很簡單啊!

參考資料

2012年4月19日

ASP.NET MVC - 第一個Web API,Hello Web API

支援版本

  • ASP.NET MVC 4 Beta

從二月中ASP.NET MVC 4 Beta 發佈到現在,終於比較有時間可以開始一系列的Web API的教學部份了,這個系列的教學,主要還是從ASP.NET的官方網站加上小弟自己的破英文翻譯與見解和而來,當然,內容絕對不會百分之百和官網一樣,畢竟算是閱讀後的筆記,所以喜歡原文的人,也可以去官網上面閱讀。

甚麼是Web API

這個要從HTTP開始說起,大家對於HTTP這四個字,我想大概每天都會去打到他,但是HTTP到底是甚麼!?沒錯,HTTP其實中文就叫做"超本文傳輸協定",所以HTTP其實是一個協定;而這個協定我們通常拿來傳遞的資料,就是HTML"超本文標記語言",但是HTTP只能應用在網頁上嗎!?,當然不,就如前面說的,HTTP是一個協定,HTTP不是一個只能處理HTML而已。

HTTP是很強大的,而且現在HTTP這個協定已經是一個公訂的標準,不管是怎樣的裝置,怎樣的設備,都有對應的應用程式可以輕鬆的使用HTTP這個協定!當然,最常用的還是在網頁上面了。

那HTTP還有甚麼應用!?沒錯,就是大家常聽到的Web Service;Web Service簡單的說,就是透過標準的Web協定( 這裡使用的是HTTP ),來提供各式各樣的服務;例如,我們可能打一段網址,他會回傳資料、或是送出一個Post訊息,他就可以發送簡訊等等,這些都是Web Service的應用。

那ASP.NET MVC Web API又是啥東西,Web API其實只是一個名詞,說穿了,只是利用ASP.NET MVC的架構去實作Web Service的服務,就是這樣的簡單;但是Web Service這塊也是有很多學問的,如果有興趣的話,大家可以再去Google查詢關於Web Service的知識,畢竟這篇是要講ASP.NET MVC Web API,我們就不要離題太遠了XDD。

Hello Web API

話不多說,與其講一堆東西讓大家睡著,那還不如趕快先來實做看看吧。

首先,我們需要建立一個新的專案,這裡我使用Visual Studio 11,但是如果使用Visual Studio 2010也是一樣的。

image

接下來,我們就使用Web API的Template吧!,如果未來熟了,也可以使用空的樣板來自己建立。

image

接下來,建立好的專案,我們就直接執行看看吧!

image

既然他預設是用IE10,那我們就用IE10來看;我們順便打開IE10的偵錯工具,按下F12,或是最右上角的齒輪圖示,裡面就可以看到偵錯工具,

image

打開後,就可以看到如下圖。

image

接下來,我們要開始監控一下網路,我們在偵錯工具選擇Network,然後選擇Start capturing。

image

接下來,我們要在網址後面加上api/values,按下enter後,可能會跳出訊息,問你要不要存檔或是開啟( 各瀏覽器的狀況可能不同 ),但不用擔心,這真的不是病毒XDD,你可選擇Save到桌面然後晚一點再刪掉,或是選擇打開,如果選擇打開,他可能會問你要用甚麼程式開啟,你可以選擇記事本,或是按ESC離開,但無論怎樣選擇,都不會有甚麼影響啦XDD;接下來,我們停止監聽,並按下旁邊的顯示詳細資料。

image

如果用記事本開啟,為了證明真的不是病毒,會出現如下畫面。

image

之後,我們就可以開始看看,這個輸入了這個網址後,發生了甚麼事情;我們先看到Request headers這邊,我們可以從這邊看到,發出請求的是GET。

image

然後我們看看Response headers,這裡代表的是回應,我們可以看到回應是200 OK,表示有正確的回應了,重點是Content-Type這邊,我們可以看到的是application/json這串文字,有沒有發現json和你剛剛存檔的副檔名是一樣的!?

image

然後我們看到Response body這邊,這就代表著回應的內容,如果剛剛你有用記事本打開,會發現內容也是一樣的;到這邊有沒有覺得很神奇!! ( 如果已經懂這些東西的前輩們,請多包涵用這個老梗QQ )。

image

或許有些人會覺得很神奇XDD,或許有些人會覺得很無聊 ( 因為看了那麼長,完全沒講到重點 ),但是我覺得,這幾個訊息是很重要的,整個ASP.NET MVC Web API會和這幾個地方息息相關。

JSON

剛剛看了那麼多東西,我相信這個名詞大家應該會特別耳熟,在談論JSON之前,還記不記得前面所談到的Web Service;沒錯,剛剛打的網址其實就是在透過HTTP來叫用一個Web Service,而這個Web Service的功能就是會傳回一些資料。

通常Web Service多多少少都會回傳一些資料,就算是呼叫傳送簡訊的Web Service,至少也會回傳個是否成功的訊息,( 當然,也可能碰到沒有回傳資料的Web Service ),而早期傳遞訊息資料,最常用到的一種格式就是XML ( 或許有人會說,也有可能只回傳一個字串阿,好吧,這也是有可能啦,但這邊既然談論的是資料,就不是單單字串這一點點的東西了 ),而XML最大的一個問題就是體積龐大。

談到了資料傳遞,我們就來談談JSON吧,JSON(JavaScript Object Notation) 其實是一種輕量級的數據交換格式,和XML最大的不同點在於,XML是一個完整的標記語言,但JSON不是;基本上,他們的設計理念本來就是不同,JSON的目標就是小巧,可以讓瀏覽器快速的解析與傳遞,而就如前面所說的,並非是要拿JSON來取代XML,兩個的取向是不同的( 實際上,之前聽一個瞭師說,XML在某些情況下,也可能比JSON還小! )

回頭看範例

我們回頭來看看上面三張圖,我們現在應該可以很清楚的了解,其實這個範例的目的,就是透過HTTP的GET,來對api/values進行呼叫,目的是取得資料。

image

然後,會回應的是JSON格式的資料,並且是utf-8編碼喔!,也因為瀏覽器發現是JSON格式,所以會問你要不要存檔,或是開啟檢視此資料。

image

然後,這個JSON的格式內容如下圖,這個表示法,是JSON的個表示法,代表著的意思是,這是一個陣列( Array ),陣列位置0的值是values1,1的位置是value2。

image

接下來,該看看Code了。

該看Code了吧

我們打開Controllers目錄下的ValuesController,如果對於ASP.NET MVC架構還不熟的人,可以參考這篇

image

其實這就是很典型的Controller,不過,現在繼承的東西不一樣了,Web API的Controller繼承的是ApiController;其次,回傳的東西也不再是ActionResult,以這邊的例子來看,回傳的就是一個IEnumerable型別。接下來,我們看一下這個程式碼的第一個Function就好,也就是Get();熟悉ASP.NET MVC的人,第一個疑問一定就是,這個Action是Get,但為什麼剛剛Key的網址卻沒有Get!?( 剛剛的網址是api/values ),我們稍微看一下後面的Function,我們會發現,這四個分別為Get、Post、Put、Delete,沒錯,聰明的你,應該發現到了,其實在ASP.NET MVC Web API 的Controller,裡面對應的不是Action了,而是HTTP裡面的四種命令( 也就是Get、Post、Put、Delete );所以網址裡面不會是以前的Controller/Action格式,而是只有Controller而已 ( 預設前面會加api,所以變成api/controller ),也就是說,實際上會呼叫哪個Controller的Function,不是利用網址來決定,而是利用HTTP的命令,這也是典型的REST風格;如前面的範例,我們就是使用HTTP的Get命令,所以對應到的是ValuesController的GET Function;舉個例子,如果是一個ClientBasicController,並有一個post() Function,要怎麼呼叫呢?,答案就是使用HTTP的post命令來呼叫網址api/ClientBasic;而這邊的Get() Function其實很簡單,就是回傳一個String陣列,裡面內容是Value1和Value2,有沒有發現,這剛好就是對應到傳回來的JSON的資料。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Web.Http;

namespace MvcHelloWebAPI.Controllers
{
    public class ValuesController : ApiController
    {
        // GET /api/values
        public IEnumerable Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET /api/values/5
        public string Get(int id)
        {
            return "value";
        }

        // POST /api/values
        public void Post(string value)
        {
        }

        // PUT /api/values/5
        public void Put(int id, string value)
        {
        }

        // DELETE /api/values/5
        public void Delete(int id)
        {
        }
    }
}

寫到這邊,我相信大家應該有一定的了解了,後面幾篇,會再針對細節詳細的解說,到這邊,只需要了解到一些基本的觀念就可以了,最後,我們還沒寫Hello World耶!,

寫Hello World吧!

我們這邊改第二個Function,也就是有傳入int的Get(),然後改成Hello Web API吧。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Web.Http;

namespace MvcHelloWebAPI.Controllers
{
    public class ValuesController : ApiController
    {
        // GET /api/values
        public IEnumerable Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET /api/values/5
        //改一下這邊!
        public string Get(int id)
        {
            return "Hello Web API";
        }

        // POST /api/values
        public void Post(string value)
        {
        }

        // PUT /api/values/5
        public void Put(int id, string value)
        {
        }

        // DELETE /api/values/5
        public void Delete(int id)
        {
        }
    }
}

然後Run起來,並且在網址邊加上api/values/1,我們就可以得到剛剛所打的字串。

image

到這邊,超級簡單的ASP.NET MVC Web API範例就完成了。

後記

其實ASP.NET MVC Web API並不難,對於初學者而言困難的反而是Web Service、JSON這些東西,對於已經熟悉Web Service的人而言,大概只要注意一下網址的格式,大致上就可以簡單上手了;所以這篇的重心,我比較放在懂ASP.NET MVC架構,但對Web Service不熟悉的人身上,也希望這篇可以讓這些人對於Web Service有個初步的了解,並且有方向可以去專研;下一篇,會開始介紹一下使用jQuery進行ASP.NET MVC Web API的呼叫,也請大家多多指教。

參考資料

2012年4月18日

Windows 8 Consumer Preview Merto Style的Messenger ( MSN ) 之三兩事

好吧,我承認標題比較很爛,因為實在是不知道怎麼下這個標題。

這篇文章的主要目的是在於Win 8 Metro Style Messenger和Desktop 的Windows Live Messenger的一些問題,其一的問題是,當使用Desktop的Windows Live Messenger後,是否可以讓Metro Style Messenger不登入,其次是如果使用Metro Style Messenger,是否可以讓Desktop的Windows Live Messenger不要自動登入,以下就是故事了。

最近把正式環境切換到Win8上,老實說,除了偶而的不習慣,和英文看無之外,其他的部分都還好,當然偶而會遇到一些小問題( 例如Metro Sytle的IE不見了 ),但是畢竟現在都還在Consumer Preview,所以也不能太苛求。

如何讓Metro Sytle的Messenger不登入

話先說在前面,如果要讓Metro Style的Messenger登出,目前小弟也找不到方法…

而使用的過程中,遇到一個比較不順手的問題就是Metro Sytle的Messenger( 也就是我們常用的MSN ),我們上班主要都是用MSN來聯絡,所以常常會有大量的MSN訊息,如果是使用Metro Style的Messenger,就要一直切換畫面,老實說,也很不順手,所以我還是會裝上Desktop的Windows Live Messenger..只是裝了以後,我的Windows Live Messenger上,都會顯示說,我目前有2個位置登入( Metro Style和Desktop ),所以我一直在想,是否可以登出Metro Style的Messenger。

後來找了國外的網站,老實說,目前並沒有好的解決方案,而這些方案也沒辦法真正的解決,但既然已經看了,也做了,就寫在這邊給大家參考;另外,如前面說的,目前連RC都不是,大家就不要太計較了..我找到的解決方案如下。

切換成本地端帳號

這種方式是最直接的,因為原本是使用Windows Live的帳號,所以Metro Style的Windows Live服務當然就會登入,當然,我們也可以使用本地端的帳號,自然就不會有這個問題,而當想要使用Merto Style的Windows Live服務時,在登入就可以了;但同樣的,這樣就會少了自動備份設定檔等等的自動機制,所以最後小弟還是沒選用。

作法很簡單,只要在控制台裡面的使用者帳號與管理,然後選擇Make Changes to my account in PC settings 就可以了,如果不知道控制台怎麼進去,可以在Desktop模式下,將滑鼠移到右下角,然後選擇Setting,就可以看到控制台的選項。

image

如果是Metro Sytle,也是從右下角,選擇Settings,然後會有一個More PC settings。

image

然後在Users裡面,依樣會有一個Switch to a local account的選項。

image

接下來,照著他的步驟處理就可以了,完成後,就變成使用本地端的帳號了。

這時候,如果重新登入Desktop的Windows Live Messenger,Metro Style的Windows Live服務就不會自動登入了,會轉成要求您的帳號。

image

但登入後,似乎就又不能登出了…

如何讓Desktop的Windows Live Messenger不要自動登入

反過來看,有時我就是想使用Metro Style的Messenger,但是如果裝了Desktop的Windows Live Messenger時,就算取消勾選自動登入,還是會很自動的幫你登入,所以這篇是來解決,如何讓Desktop的Windows Live Messenger不要自動登入。

停用自動登入Windows Live服務

這個方法可以讓Metro Style的自動登入Windows Live服務停止,但是小弟的測試後,發現如果停止,Desktop的Windows Live Messenger也會沒辦法登入。

首先,我們要先把Administrator Tools打開,將滑鼠移到右下角,然後選擇設定。( 記住要在Metro Style底下喔 )

image

將Show administrator tools功能改成Yes。

image

接下來,我們要回到控制台,這個控制台就要在Desktop底下了 (如果不知道控制台怎麼進去,可以在Desktop模式下,將滑鼠移到右下角,然後選擇Setting,就可以看到控制台的選項。 ),接下來因為小弟用分類模式實在是找不到XDD,所以我們先改變一下View。

image

改成大圖後,我們就可以看到Administrator Tools了。

image

接著,我們可以看到許多工具,但我們這邊要選擇Services。

image

在Services裡面有一個Microsoft Account Sign-in Assistant的Service,我們進去把它關閉。

image

預設給他Disabled,這樣,就不會自動登入了。

image

後記

就如小弟說的,這部分可能還是沒有比較好的方法,不過畢竟目前Win 8還沒正式RC,相信未來版本會更加貼近人性化,如過在這邊專研,其實也沒多大意義,只是剛好有找到這些文章與問題,也相信可能有搶先者會有困擾,所以這部分的文章,就先給需要搶鮮的人,當作參考吧,相信未來隨著Win 8的發布,軟體的更新,這個問題就不會再是問題了。

參考資料