首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WCF Web 程式設計模型實戰:建立 REST 服務與 ASP.NET AJAX 整合

     編輯:關於.NET

WCF 3.5 引入 Web 程式設計模型,支援 REST 風格服務與 ASP.NET AJAX 無縫整合。關鍵在於兩個 Factory:WebServiceHostFactory(REST)與 WebScriptServiceHostFactory(AJAX)。

案例一:建立 RESTful 服務

資料契約

[DataContract]
public class User {
    [DataMember(Order = 0)] public string Name { get; set; }
    [DataMember(Order = 1)] public DateTime DayOfbirth { get; set; }
}

服務契約:對應 HTTP 動詞

[ServiceContract]
public interface IREST {
    [OperationContract]
    [WebInvoke(UriTemplate = "User/{name}/{dayOfbirth}", Method = "PUT", ResponseFormat = WebMessageFormat.Json)]
    User CreateUser(string name, string dayOfbirth);

    [OperationContract]
    [WebGet(UriTemplate = "User/{name}", ResponseFormat = WebMessageFormat.Json)]
    User GetUser(string name);

    [OperationContract]
    [WebInvoke(UriTemplate = "User/{name}/{dayOfbirth}", Method = "POST", ResponseFormat = WebMessageFormat.Json)]
    bool UpdateUser(string name, string dayOfbirth);

    [OperationContract]
    [WebInvoke(UriTemplate = "User/{name}", Method = "DELETE", ResponseFormat = WebMessageFormat.Json)]
    bool DeleteUser(string name);
}
  • WebGet:查詢操作(GET)
  • WebInvoke:非查詢操作,Method 指定 PUT/POST/DELETE
  • UriTemplate:REST 風格 URL 範本
  • ResponseFormat:JSON 或 XML

服務實作

public class REST : IREST {
    public User CreateUser(string name, string dayOfbirth) {
        return new User { Name = name, DayOfbirth = DateTime.Parse(dayOfbirth) };
    }
    public User GetUser(string name) {
        return new User { Name = name, DayOfbirth = new DateTime(1980, 2, 14) };
    }
    public bool UpdateUser(string name, string dayOfbirth) => true;
    public bool DeleteUser(string name) => true;
}

裝載與設定

REST.svc

<%@ ServiceHost Language="C#" Debug="true" Service="WCF.ServiceLib.Web.REST" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

Web.config

<system.serviceModel>
  <behaviors>
    <endpointBehaviors>
      <behavior name="RESTBehavior">
        <webHttp /> <!-- 啟用 Web 程式設計模型 -->
      </behavior>
    </endpointBehaviors>
  </behaviors>
  <services>
    <service name="WCF.ServiceLib.Web.REST" behaviorConfiguration="WebBehavior">
      <endpoint address="" binding="webHttpBinding" contract="WCF.ServiceLib.Web.IREST" behaviorConfiguration="RESTBehavior" />
    </service>
  </services>
</system.serviceModel>

客戶端呼叫

var client = new WebClient();
var create = client.UploadString("https://localhost:3502/.../User/webabcd/1980-2-14", "PUT", "");
var read = client.DownloadString("https://localhost:3502/.../User/webabcd");
var update = client.UploadString("https://localhost:3502/.../User/webabcd/1980-2-14", "POST", "");
var delete = client.UploadString("https://localhost:3502/.../User/webabcd", "DELETE", "");

回應範例

{"Name":"webabcd","DayOfbirth":"\/Date(319305600000+0800)\/"}
{"Name":"webabcd","DayOfbirth":"\/Date(319305600000+0800)\/"}
true
true

案例二:ASP.NET AJAX 呼叫 WCF

服務契約與實作

[ServiceContract(Namespace = "WCF")]
public interface IAJAX {
    [OperationContract] User GetUser(string name);
}

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class AJAX : IAJAX {
    public User GetUser(string name) {
        return new User { Name = name, DayOfbirth = new DateTime(1980, 2, 14) };
    }
}

AspNetCompatibilityRequirements 允許存取 HttpContext、Session、全域化等 ASP.NET 功能。

裝載與設定

AJAX.svc

<%@ ServiceHost Language="C#" Debug="true" Service="WCF.ServiceLib.Web.AJAX" Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory" %>

Web.config

<endpointBehaviors>
  <behavior name="AJAXBehavior">
    <enableWebScript /> <!-- 啟用腳本程式設計模型 -->
  </behavior>
</endpointBehaviors>
<services>
  <service name="WCF.ServiceLib.Web.AJAX" behaviorConfiguration="WebBehavior">
    <endpoint address="" binding="webHttpBinding" contract="WCF.ServiceLib.Web.IAJAX" behaviorConfiguration="AJAXBehavior" />
  </service>
</services>

前端 JavaScript 呼叫

<asp:ScriptManager ID="ScriptManager1" runat="server">
  <Services>
    <asp:ServiceReference Path="Service/AJAX.svc" />
  </Services>
</asp:ScriptManager>

<script type="text/javascript">
function pageLoad() {
    var proxy = new WCF.IAJAX();
    proxy.GetUser("webabcd", onSuccess);
}
function onSuccess(result) {
    $get('<%= lblMsg.ClientID %>').innerHTML = 
        String.format("姓名:{0}<br />生日:{1}", result.Name, result.DayOfbirth.format("yyyy-MM-dd"));
}
</script>

結果

姓名:webabcd
生日:1980-02-14

關鍵差異比較

特性REST (WebServiceHostFactory)AJAX (WebScriptServiceHostFactory)
端點行為<webHttp /><enableWebScript />
序列化格式JSON/XML 可選JSON (含型別資訊)
客戶端任意 HTTP ClientASP.NET AJAX Proxy
ASP.NET 相容性選用需啟用

善用 WCF Web 模型,快速建構現代化 Web API 與 Rich Internet Application 後端服務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved