WCF 3.5 引入 Web 程式設計模型,支援 REST 風格服務與 ASP.NET AJAX 無縫整合。關鍵在於兩個 Factory:WebServiceHostFactory(REST)與 WebScriptServiceHostFactory(AJAX)。
[DataContract]
public class User {
[DataMember(Order = 0)] public string Name { get; set; }
[DataMember(Order = 1)] public DateTime DayOfbirth { get; set; }
}
[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/DELETEUriTemplate:REST 風格 URL 範本ResponseFormat:JSON 或 XMLpublic 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
[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>
<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 Client | ASP.NET AJAX Proxy |
| ASP.NET 相容性 | 選用 | 需啟用 |
善用 WCF Web 模型,快速建構現代化 Web API 與 Rich Internet Application 後端服務。