如同SOA下的WCF,REST架構下的WCF也有多種多樣的寄宿方式,如IIS寄宿,自寄宿等等,即使它只有一種協議。
由於REST基於HTTP協議的特點,所以這種架構下的WCF寄宿時,需要有Web伺服器的支援。那麼很顯然,微軟肯定會使用
自己的Web伺服器IIS了。
本節目錄:
1、IIS寄宿
2、控制台程式寄宿(暫且將它稱為自寄宿)
當然,REST WCF還有其他的寄宿方式,我這裡只挑出典型的兩種給大家介紹。有興趣的朋友不妨試試其他的寄宿方式。
本節中所使用的執行個體還是上節所使用的例子。Demo結構圖如下:
結構說明:Client為服務消費者,Contracts定義服務契約、資料契約,Services定義服務的實現,SelfHost、WebHost:自寄宿、IIS寄宿程式宿主程式
在IIS或者自寄宿中使用同樣的服務契約。服務契約的定義如下:
[ServiceContract]public interface ILog{[OperationContract][WebGet(UriTemplate = "/")]List<LogEntity> GetAll();[OperationContract][WebGet(UriTemplate = "/Log/{year}/{month}")]List<LogEntity> GetMonthLog(string year, string month);}
資料契約定義:
[DataContract]public class LogEntity{[DataMember]public int ID { get; set; }[DataMember]public string EventName { get; set; }[DataMember]public string Level { get; set; }[DataMember]public DateTime Time { get; set; }}
服務的實現代碼:
#region ILog 成員public List<LogEntity> GetAll(){return GetLogEntityList();}public List<LogEntity> GetMonthLog(string year, string month){List<LogEntity> logEntities = GetLogEntityList();List<LogEntity> logList = new List<LogEntity>();logEntities.ForEach(log =>{if (log.Time.Year.ToString() == year && log.Time.Month.ToString() == month){logList.Add(log);}});return logList;}#endregion
1、IIS寄宿。
眾所周知Web程式基於HTTP協議,REST也基於HTTP。REST架構認為:WEB很成功、很簡潔,不用那麼複雜。所以基於
IIS的寄宿就很容易理解了。在IIS的寄宿中,我直接建了一個Web項目,然後在WCF 服務檔案裡面裡提供對服務的調用。
代碼如下:
public List<LogEntity> GetAll(){LogServices services = new LogServices();return services.GetAll();}public List<LogEntity> GetMonthLog(string year, string month){LogServices services = new LogServices();return services.GetMonthLog(year, month);}
這樣就實現了介面規範中定義的對外提供服務。
2、控制台程式寄宿。
2.1通過編碼實現REST WCF 寄宿。
寄宿代碼如下:
static void HostViaCode(){using (WebServiceHost host = new WebServiceHost(typeof(LogServices))){ServiceEndpoint endpoint = host.AddServiceEndpoint(typeof(ILog), new WebHttpBinding(),"http://127.0.0.1:6688/LogService");endpoint.Behaviors.Add(new WebHttpBehavior());Console.WriteLine("服務開啟...");host.Open();Console.ReadLine();}}
2.2、通配置的方式實現REST WCF 寄宿。
首先在設定檔中進行相關的終結點等等配置。設定檔如下:
<system.serviceModel><behaviors><serviceBehaviors ><behavior name="RESTServiceBehavior"></behavior></serviceBehaviors><endpointBehaviors><behavior name="servierBehavior"></behavior></endpointBehaviors></behaviors><services><service name="Services.LogServices" behaviorConfiguration="RESTServiceBehavior"><endpoint address="Http://127.0.0.1:8866/LogService" contract="Contracts.ILog" binding="webHttpBinding" behaviorConfiguration="servierBehavior"></endpoint></service></services></system.serviceModel>
對WCF SOA 架構有一點瞭解的同學,一看就明白了,是的,REST架構下採用自寄宿的方式進行寄宿時和SOA中沒有什麼不同。
在這種配置寄宿時的代碼如下:
using(WebServiceHost host=new WebServiceHost(typeof(LogServices))){Console.WriteLine("服務開啟...");host.Open();Console.ReadLine();}
這樣就實現了在控制台程式中對REST WCF服務的寄宿。
在IE中調用GetAll介面,擷取到的資料如:
在IE中調用GetMonthLog介面,擷取到的資料如:
最後,在Client中,調用服務,代碼如下:
private const string address = "Http://127.0.0.1:8866/LogService";static void Main(string[] args){InvokeRESTService();Console.ReadLine();}static void InvokeRESTService(){HttpWebRequest webRequest = WebRequest.Create(address) as HttpWebRequest;webRequest.Method = "GET";HttpWebResponse webResponse = webRequest.GetResponse() as HttpWebResponse;using (StreamReader reader=new StreamReader(webResponse.GetResponseStream()) ){Console.WriteLine(string.Format("擷取的調用結果為:{0}",reader.ReadToEnd())); }}
不管是IIS寄宿,還是自寄宿,不同的寄宿方式下,客戶單調用結果如:
提示,通過配置的方式寄宿REST WCF 服務,雖然在服務端程式啟動時,也會有一個Asp.Net Development Server
啟動,但是它對用戶端對服務的調用沒有影響。我們可以看到,服務端在啟動後,如果關閉Asp.Net Development Server,
用戶端對服務的調用依然是成功的。
以上分別是 REST WCF在IIS與控制台程式下的寄宿方式。同樣地它一定也能在其他程式:如Windows Service程式,Winform程式中實現寄宿。
另外,我對前三節中契約的定義有個小的變動,就是在[WebGet(UriTemplate = "/Log/{year}/{month}")]中用Log替換了Get,這樣能更清晰地
表述REST思想。