RestFul風格的WCF既然作為跨平臺、跨語言、跨技術的一種方式出現,並且在ASP.NET API流行起來之前還是架構的首選技術之一,那麼我們就來簡要的介紹一下WCF在各個平臺客戶端的操作。
開發工具及版本:Microsoft Visual Studio 2013(.net 4.0),jQuery JavaScript Library v1.4.2,
服務端建立步驟:
第一步:
開啟vs建立一個類庫名為:ILongshi.BIZ。(為何要建立類庫而不是WCF類庫,是要完全從頭開始手動完成所有操作並且加深對WCF的理解)。
刪除多餘的Class1類,建立一個User類,具備ID,NAME,AGE屬性,然後為類名加上屬性DataContract,欄位名加上屬性DataMember,
解釋:一旦宣告一個型別為DataContract,那麼該型別就可以被序列化在服務端和客戶端之間傳送,只有宣告為DataContract的型別的物件可以被傳送,且只有成員屬性會被傳遞,成員方法不會被傳遞。但是預設情況下,所有的成員屬性都被排除在外,因此需要把每一個要傳送的成員宣告為DataMember才能被傳遞。
具體程式碼如:
[DataContract] [Serializable] public class User { [DataMember] public string ID { get; set; } [DataMember] public string Age { get; set; } [DataMember] public string Name { get; set; } }
新增引用的元件有:
第二步:
建立服務契約,建立一個名為UserService的類(這裡我們不直接建立介面,但是建議建立成介面,還是那句話,快速構建),然後依次建立4個具有代表性的方法:
然後為類加上屬性:
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode =
AspNetCompatibilityRequirementsMode.Allowed)]
再為每一個方法加上屬性:
[OperationContract]
[WebInvoke]
解釋:[ServiceContract] 這個特性告訴編譯器,該型別是一個服務契約,
[OperationContract] 這個特性告訴編譯器,該成員是一個操作契約,
詳細程式碼如:
[ServiceContract] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class UserService { [OperationContract] [WebInvoke(UriTemplate = "GetPerson", ResponseFormat = WebMessageFormat.Json, Method = "GET")] public User GetUser() { return new User { Age="12", ID="001", Name="zhangsan"}; } [OperationContract] [WebInvoke(UriTemplate = "GetPersonById/{id}", ResponseFormat = WebMessageFormat.Json, Method = "GET")] public User GetUserById(string id) { return new User { Age = "12", ID = id, Name = "lisi" }; } [OperationContract] [WebInvoke(UriTemplate = "GetPersonPost", ResponseFormat = WebMessageFormat.Json, Method = "POST")] public User GetUserPost() { return new User { Age = "12", ID = "003", Name = "wangwu" }; } [OperationContract] [WebInvoke(UriTemplate = "GetPersonPostById", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json, Method = "POST")] public User GetUserPostById(string id, string name, string age) { return new User { Age = age, ID = id + "server", Name = name }; } }
前2個方法分別為有參和無參GET方式,後2個分別為有參和無參POST方式。如此服務端就完成了。
第三步:
建立宿主和異形一樣,沒有母體他沒辦法執行,這裡我們將宿主建立成網站,那麼請在解決方案管理器中右鍵,然後建立一個WEB空應用程式。
然後新增對剛才類庫的引用
開啟Web.config在configuration節點下system.web節點上建立system.serviceModel節點,依次增加需要的其他配置,具體程式碼如下:
詳細程式碼:
<system.serviceModel> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"> <serviceActivations> <add relativeAddress="UserService.svc" service="ILongshi.BIZ.UserService"/> </serviceActivations> </serviceHostingEnvironment> <behaviors> <serviceBehaviors> <behavior name=""> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="true"/> </behavior> </serviceBehaviors> <endpointBehaviors> <behavior name="BehaviorConfig"> <webHttp helpEnabled="true"/> </behavior> </endpointBehaviors> </behaviors> <services> <service name="ILongshi.BIZ.UserService"> <endpoint address="" behaviorConfiguration="BehaviorConfig" binding="webHttpBinding" contract="ILongshi.BIZ.UserService"/> </service> </services> </system.serviceModel>
解釋:預設情況下ASP.NET相容性支援是關閉的,但很多時候需要開啟Asp.Net的相容性來利用Asp.Net的一些特性(使用session,上下文等),具體可參考http://msdn.microsoft.com/zh-cn/library/ms752234.aspx。
如果要開啟相容性,需要做兩步:一是在服務類加上如下標記:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class AppRuntimeStateSvc : IAppRuntimeStateSvc
{
//服務程式碼.
}
二是在web.config中的<system.serviceModel>段里加:
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
注意框架3.5以前都是預設就支援的,4.0以後預設就是沒有開啟相容性支援的。
includeExceptionDetailInFaults要接收故障異常詳細資訊以進行除錯,請將以下值設定為 true。在部署前設定為 false 以避免洩漏異常資訊
將httpGetEnabled設定為true,使客戶端能夠成功捕獲服務
其餘就是標準繫結了,如果address值為空,那麼endpoint的地址就是預設的基地址(Base Address)。
第四步:
檢視服務,將專案WEBHOST設定為啟動專案,然後F5,在自動生成的網址後面加上配置的服務名,一切正常的話會出現這個頁面:
試著訪問下第一個服務,在地址後面加上操作名,如http://localhost:3720/userService.svc/GetPerson
將會出現:(建議使用火狐或者GOOGLE瀏覽器除錯IE位址列顯示不全)
能看到這個就證明服務釋出OK了,並且返回的是JSON格式。
本節原始碼:下載