天天看點

化零為整WCF(18) - Web程式設計模型(WCF建立REST, AJAX調用WCF)

<a href="http://webabcd.blog.51cto.com/1787395/343999" target="_blank">[索引頁]</a>

化零為整WCF(18) - Web程式設計模型(WCF建立REST, AJAX調用WCF)

介紹

WCF(Windows Communication Foundation) - Web程式設計模型:使用WCF建立REST服務,使用asp.net ajax調用WCF服務 

    ·System.ServiceModel.Activation.WebServiceHostFactory - 用于承載使用 WCF Web 程式設計模型的服務

    ·System.ServiceModel.Activation.WebScriptServiceHostFactory  - 能夠向服務中自動添加 ASP.NET AJAX 終結點而無需進行配置

示例(使用WCF建立REST服務)

1、服務

User.cs

using System; 

using System.Collections.Generic; 

using System.Linq; 

using System.Text; 

using System.ServiceModel; 

using System.Runtime.Serialization; 

namespace WCF.ServiceLib.Web 

        /// &lt;summary&gt; 

        /// User實體類 

        /// &lt;/summary&gt; 

        [DataContract] 

        public class User 

        { 

                /// &lt;summary&gt; 

                /// 使用者名 

                /// &lt;/summary&gt; 

                [DataMember(Order = 0)] 

                public string Name { get; set; } 

                /// 生日 

                [DataMember(Order = 1)] 

                public DateTime DayOfbirth { get; set; } 

        } 

}

IREST.cs

using System.ServiceModel.Web; 

        /// 示範REST(Representational State Transfer)的接口 

        /// &lt;remarks&gt; 

        /// HTTP方法中: 

        /// PUT相當于Create 

        /// GET相當于Read 

        /// POST相當于Update 

        /// DELETE相當于Delete 

        /// &lt;/remarks&gt; 

        [ServiceContract] 

        public interface IREST 

                /// 建立使用者 

                /// &lt;param name="name"&gt;使用者名&lt;/param&gt; 

                /// &lt;param name="dayOfbirth"&gt;生日&lt;/param&gt; 

                /// &lt;remarks&gt; 

                /// WebInvoke - 訓示服務操作在邏輯上就是調用操作,而且可由 Web 程式設計模型調用 

                /// UriTemplate - 用于服務操作的統一資源辨別符 (URI) 模闆。URI模闆可以将一個 URI 或一組 URI 映射到服務操作。有關 URI 模闆的更多資訊,請參見 UriTemplate 和 UriTemplateTable 

                /// Method - 與操作關聯的協定方法,預設為 POST 

                /// ResponseFormat - 指定從服務操作發出的響應的格式。Xml 或 Json 

                /// &lt;/remarks&gt; 

                [OperationContract] 

                [WebInvoke( 

                        UriTemplate = "User/{name}/{dayOfbirth}", 

                        Method = "PUT", 

                        ResponseFormat = WebMessageFormat.Json)] 

                User CreateUser(string name, string dayOfbirth); 

                /// 擷取使用者資訊 

                /// WebGet - 訓示服務操作在邏輯上就是檢索操作,而且可由 Web 程式設計模型調用 

                [WebGet( 

                        UriTemplate = "User/{name}", 

                User GetUser(string name); 

                /// 更新使用者資訊 

                /// &lt;returns&gt;&lt;/returns&gt; 

                [WebInvoke(UriTemplate = "User/{name}/{dayOfbirth}", 

                        Method = "POST", 

                bool UpdateUser(string name, string dayOfbirth); 

                /// 删除使用者資訊 

                        Method = "DELETE", 

                bool DeleteUser(string name); 

REST.cs

        /// 示範REST(Representational State Transfer)的類 

        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) 

                        return true; 

                public bool DeleteUser(string name) 

2、宿主

REST.svc

&lt;%@ ServiceHost Language="C#" Debug="true" Service="WCF.ServiceLib.Web.REST" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %&gt;

注:System.ServiceModel.Activation.WebServiceHostFactory - 用于承載使用 WCF Web 程式設計模型的服務

Web.config

&lt;?xml version="1.0"?&gt; 

&lt;configuration&gt; 

        &lt;system.serviceModel&gt; 

                &lt;behaviors&gt; 

                        &lt;serviceBehaviors&gt; 

                                &lt;behavior name="WebBehavior"&gt; 

                                        &lt;!--httpGetEnabled - 訓示是否釋出服務中繼資料以便使用 HTTP/GET 請求進行檢索,如果釋出 WSDL,則為 true,否則為 false,預設值為 false--&gt; 

                                        &lt;serviceMetadata httpGetEnabled="true" /&gt; 

                                &lt;/behavior&gt; 

                        &lt;/serviceBehaviors&gt; 

                        &lt;endpointBehaviors&gt; 

                                &lt;behavior name="RESTBehavior"&gt; 

                                        &lt;!--webHttp - 啟用 WCF 服務的 Web 程式設計模型--&gt; 

                                        &lt;webHttp /&gt; 

                        &lt;/endpointBehaviors&gt; 

                &lt;/behaviors&gt; 

                &lt;services&gt; 

                        &lt;!--name - 提供服務的類名--&gt; 

                        &lt;!--behaviorConfiguration - 指定相關的服務行為配置--&gt; 

                        &lt;service name="WCF.ServiceLib.Web.REST" behaviorConfiguration="WebBehavior"&gt; 

                                &lt;!--address - 服務位址--&gt; 

                                &lt;!--binding - 通信方式--&gt; 

                                &lt;!--contract - 服務契約--&gt; 

                                &lt;!--behaviorConfiguration - 指定相關的端點行為配置--&gt; 

                                &lt;endpoint address="" binding="webHttpBinding" contract="WCF.ServiceLib.Web.IREST" behaviorConfiguration="RESTBehavior" /&gt; 

                        &lt;/service&gt; 

                &lt;/services&gt; 

        &lt;/system.serviceModel&gt; 

&lt;/configuration&gt;

3、用戶端

REST.aspx

&lt;%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="REST.aspx.cs" 

        Inherits="Web_REST" Title="WCF建立REST" %&gt; 

&lt;asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server"&gt; 

&lt;/asp:Content&gt; 

&lt;asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"&gt; 

        &lt;asp:Label ID="lblMsg" runat="server" /&gt; 

&lt;/asp:Content&gt;

REST.aspx.cs

using System.Collections; 

using System.Configuration; 

using System.Data; 

using System.Web; 

using System.Web.Security; 

using System.Web.UI; 

using System.Web.UI.HtmlControls; 

using System.Web.UI.WebControls; 

using System.Web.UI.WebControls.WebParts; 

using System.Xml.Linq; 

using System.Net; 

public partial class Web_REST : System.Web.UI.Page 

        protected void Page_Load(object sender, EventArgs e) 

                var client = new WebClient(); 

                var create = client.UploadString("http://localhost:3502/ServiceHost/Web/REST.svc/User/webabcd/1980-2-14", "PUT", string.Empty); 

                var read = client.DownloadString("http://localhost:3502/ServiceHost/Web/REST.svc/User/webabcd"); 

                var update = client.UploadString("http://localhost:3502/ServiceHost/Web/REST.svc/User/webabcd/1980-2-14", "POST", string.Empty); 

                var delete = client.UploadString("http://localhost:3502/ServiceHost/Web/REST.svc/User/webabcd", "DELETE", string.Empty); 

                lblMsg.Text = string.Format("{0}&lt;br /&gt;{1}&lt;br /&gt;{2}&lt;br /&gt;{3}", 

                        create, 

                        read, 

                        update, 

                        delete); 

運作結果:

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

true

示例(使用asp.net ajax調用WCF服務) 

1、服務 

IAJAX.cs

        /// 示範AJAX的接口 

        [ServiceContract(Namespace = "WCF")] 

        public interface IAJAX 

                /// 擷取使用者 

AJAX.cs

using System.ServiceModel.Activation; 

        /// 示範AJAX的類 

        /// ASP.NET 相容性模型: 

        /// 如果在負載平衡或者甚至 Web 園的環境中承載 WCF 服務,并且在該環境中後續的會話請求可以被此環境内的不同宿主或程序處理,則需要對會話狀态進行程序外持久存儲。最新的 WCF 不支援會話狀态的持久存儲。相反,WCF 将它的所有會話狀态存儲在記憶體中。如果在 IIS 中承載 WCF 服務,最後可以使用回收方案。 

        /// WCF 依賴于會話狀态的 ASP.NET 實作,而不是為會話全部再次建立持久存儲。此方式有一個嚴重的限制:使服務僅限于 HTTP 

        /// ASP.NET 會話狀态不是受 ASP.NET 相容性模式支援的唯一功能。它還支援諸如 HttpContext、globalization 和模拟等功能,就像用于 ASP.NET Web 服務 (ASMX) 一樣 

        /// [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

        public class AJAX : IAJAX 

AJAX.svc

&lt;%@ ServiceHost Language="C#" Debug="true" Service="WCF.ServiceLib.Web.AJAX" Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory" %&gt;

注:System.ServiceModel.Activation.WebScriptServiceHostFactory  - 能夠向服務中自動添加 ASP.NET AJAX 終結點而無需進行配置

                                &lt;behavior name="AJAXBehavior"&gt; 

                                        &lt;!--enableWebScript - 啟用 WCF 服務的 腳本 程式設計模型--&gt; 

                                        &lt;enableWebScript /&gt; 

                        &lt;service name="WCF.ServiceLib.Web.AJAX" behaviorConfiguration="WebBehavior"&gt; 

                                &lt;endpoint address="" binding="webHttpBinding" contract="WCF.ServiceLib.Web.IAJAX" behaviorConfiguration="AJAXBehavior" /&gt; 

Demo.aspx

&lt;%@ Page Language="C#" AutoEventWireup="true" CodeFile="Demo.aspx.cs" Inherits="Demo" %&gt; 

&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt; 

&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt; 

&lt;head runat="server"&gt; 

        &lt;title&gt;AJAX調用WCF&lt;/title&gt; 

&lt;/head&gt; 

&lt;body&gt; 

        &lt;form id="form1" runat="server"&gt; 

                 &lt;asp:ScriptManager ID="ScriptManager1" runat="server"&gt; 

                        &lt;Services&gt; 

                                &lt;asp:ServiceReference Path="Service/AJAX.svc" /&gt; 

                        &lt;/Services&gt; 

                &lt;/asp:ScriptManager&gt; 

                &lt;asp:Label ID="lblMsg" runat="server" /&gt; 

                &lt;script type="text/javascript"&gt; 

                        function pageLoad() 

                        { 

                                var proxy = new WCF.IAJAX(); 

                                proxy.GetUser("webabcd", onSuccess); 

                        } 

                        function onSuccess(result) 

                                $get('&lt;%= lblMsg.ClientID %&gt;').innerHTML = 

                                        String.format("姓名:{0}&lt;br /&gt;生日:{1}", result.Name, result.DayOfbirth.format("yyyy-MM-dd")); 

                &lt;/script&gt; 

        &lt;/form&gt; 

&lt;/body&gt; 

&lt;/html&gt;

姓名:webabcd

生日:1980-02-14

OK

<a href="http://down.51cto.com/data/100781" target="_blank">[源碼下載下傳]</a>

     本文轉自webabcd 51CTO部落格,原文連結:http://blog.51cto.com/webabcd/344176,如需轉載請自行聯系原作者