REST下的WCF的寄宿方式
如同SOA下的WCF,REST架構下的WCF也有多種多樣的寄宿方式,如IIS寄宿,自寄宿等等,即使它只有一種協議。
由于REST基于HTTP協議的特點,所以這種架構下的WCF寄宿時,需要有Web服務器的支持。那么很顯然,微軟肯定會使用
自己的Web服務器IIS了。
本節(jié)目錄:
1、IIS寄宿
2、控制臺程序寄宿(暫且將它稱為自寄宿)
當然,REST WCF還有其他的寄宿方式,我這里只挑出典型的兩種給大家介紹。有興趣的朋友不妨試試其他的寄宿方式。
本節(jié)中所使用的實例還是上節(jié)所使用的例子。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);
}
這樣就實現了接口規(guī)范中定義的對外提供服務。
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程序中實現寄宿。
另外,我對前三節(jié)中契約的定義有個小的變動,就是在[WebGet(UriTemplate = "/Log/{year}/{month}")]中用Log替換了Get,這樣能更清晰地
表述REST思想。
浙公網安備 33010602011771號