2012年9月8日

[Windows Azure Service Bus]我的Azure Service Bus初探

Windows Azure Service Bus是Windows Azure平台提供的一個訊息溝通管道, 可以讓企業內的服務透過簡單的設定輕易的部屬到網際網路上. 在開接觸他之前, 我也著實幻想過怎麼樣能夠簡單的在不修改, 或是小部分修改程式, 且不需要動到公司內部網路架構的情況下就能把我的服務佈署到網際網路上. 不過如果沒有一個成熟的雲端平台, 基本上都會遇到很大的問題, 例如, 把服務搬到網際網路上意味著服務網址會改變, 那麼所有的內部使用這個服務的程式都必須配合修改. 把服務放到網路上, 也代表著我必須要有一個穩定的平台來host我的服務, 並且從此我都必須要把程式直接放到網路上, 這服務如果有存取到內部的資料庫(大部分的情況下一定是如此), 那麼我的服務顯然必須要做大幅度的修改.

幸好, 有了Windows Azure Service Bus, 我們可以簡單的把服務的端點註冊到網際網路上, 透過Windows Azure Service Bus幫我們讓網際網路上的使用者也能簡單的呼叫到我們企業內部的服務.

要使用Windows Azure Service Bus, 首先必須要先到Windows Azure管理介面上新增一個namespace.

image

按下建立之後, 就會建立這個namespace

image

接下來就可以開始寫程式啦~

首先要先建立一個WCF 服務, 這邊我用Windows Form來host一個服務回傳執行這個服務個體的機器名稱.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace WinFormHost
{
[ServiceContract]
public interface IWinSvc
{
[OperationContract]
string DoWork();
}
public class WinSvc : IWinSvc
{
public string DoWork()
{
return string.Format("Returned from {0}",System.Environment.MachineName);
}
}
}





服務的config, 首先只是簡單的使用HTTP提供介面給使用者呼叫.



    </system.serviceModel>
<services>
<service name="WinFormHost.WinSvc">
<endpoint address="" binding="basicHttpBinding" name="WinSvcHttp"
bindingName="basicHttpBinding" contract="WinFormHost.IWinSvc">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8733/services/WinSvcHttp/" />
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>


然後是服務的host


using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WinFormHost
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
System.ServiceModel.ServiceHost host = null;
private void button1_Click(object sender, EventArgs e)
{
host = new System.ServiceModel.ServiceHost(typeof(WinFormHost.WinSvc));
host.Open();

MessageBox.Show(string.Format("Service opened at {0}", host.Description.Endpoints[0].Address));
}

private void button2_Click(object sender, EventArgs e)
{
host.Close();
}
}
}



測試結果, 證明這是一個跑在本機上的WCF服務.


image


接下來我們要把服務透過Windows Azure Service Bus發布給網際網路上的程式呼叫了.


首先要從管理介面上取得我們剛剛建立的namespace的金鑰, 所有要存取我們的服務的客戶端都需要都會需要在呼叫服務時指定這組金鑰才能順利的存取到我們的服務.


image


接著將Microsoft.ServiceBus這個assembly加入原本WCF程式的reference中, 然後修改WCF的app.config檔, 讓他使用Windows Azure service bus提供的binding.


首先加入必要的extension


image


設定新的endpoint behavior


image


加入新的Service Endpoint, 這邊的位址的schema要指定為sb, 另外使用NetTcpRelayBinding作為傳輸方式


image










接下來是呼叫端, 這邊我用一個Web Role來呼叫, 並將得到的回傳結果顯示到畫面上



        protected void testButton_Click(object sender, EventArgs e)
{
Microsoft.ServiceBus.ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.Http;//Force HTTP mode

var url = Microsoft.ServiceBus.ServiceBusEnvironment.CreateServiceUri("sb", "michi-sb-test01", "WinSvc");
var epBehavior = new Microsoft.ServiceBus.TransportClientEndpointBehavior(Microsoft.ServiceBus.SharedSecretTokenProvider.CreateSharedSecretTokenProvider(
"issuerName", "issuerSecret"));

var factory = new System.ServiceModel.ChannelFactory<WinFormHost.IWinSvc>("WinSvc", new System.ServiceModel.EndpointAddress(url));
status.Text = string.Format("invoking {0}", factory.Endpoint.Address.ToString());
var proxy = factory.CreateChannel();
using (proxy as IDisposable)
{
status.Text = proxy.DoWork();
}
}



接下來修改呼叫端的config檔



image



到這裡就算是大功告成了! 接下來只要測試就可以了! 首先執行Service host 確定服務已經註冊到Azure Service Bus上



image



然後執行測試程式! 大功告成!



image

沒有留言:

Blog Archive

About Me