使用多種客戶端消費WCF RestFul服務(一)——服務端

石曼迪發表於2013-12-02

RestFul風格的WCF既然作為跨平臺、跨語言、跨技術的一種方式出現,並且在ASP.NET API流行起來之前還是架構的首選技術之一,那麼我們就來簡要的介紹一下WCF在各個平臺客戶端的操作。

開發工具及版本:Microsoft Visual Studio 2013(.net 4.0),jQuery JavaScript Library v1.4.2,

服務端建立步驟:

第一步:

開啟vs建立一個類庫名為:ILongshi.BIZ。(為何要建立類庫而不是WCF類庫,是要完全從頭開始手動完成所有操作並且加深對WCF的理解)。

clip_image002

刪除多餘的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; }
    }

新增引用的元件有:

clip_image004

第二步:

建立服務契約,建立一個名為UserService的類(這裡我們不直接建立介面,但是建議建立成介面,還是那句話,快速構建),然後依次建立4個具有代表性的方法:

clip_image006

然後為類加上屬性:

[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空應用程式。

clip_image008

然後新增對剛才類庫的引用

clip_image010

開啟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,在自動生成的網址後面加上配置的服務名,一切正常的話會出現這個頁面:

clip_image012

試著訪問下第一個服務,在地址後面加上操作名,如http://localhost:3720/userService.svc/GetPerson

將會出現:(建議使用火狐或者GOOGLE瀏覽器除錯IE位址列顯示不全)

clip_image014

能看到這個就證明服務釋出OK了,並且返回的是JSON格式。

本節原始碼:下載

相關文章