化零为整WCF(18) - Web编程模型(WCF创建REST, AJAX调用WCF)

简介:
[索引页]
[源码下载] 


化零为整WCF(18) - Web编程模型(WCF创建REST, AJAX调用WCF)


作者: webabcd


介绍
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 

         /// <summary> 
         /// User实体类 
         /// </summary> 
        [DataContract] 
         public  class User 
        { 
                 /// <summary> 
                 /// 用户名 
                 /// </summary> 
                [DataMember(Order = 0)] 
                 public  string Name { get; set; } 
 
                 /// <summary> 
                 /// 生日 
                 /// </summary> 
                [DataMember(Order = 1)] 
                 public DateTime DayOfbirth { get; set; } 
        } 
 
}
 
IREST.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
 
using System.ServiceModel; 
using System.ServiceModel.Web; 
 
namespace WCF.ServiceLib.Web 

         /// <summary> 
         /// 演示REST(Representational State Transfer)的接口 
         /// </summary> 
         /// <remarks> 
        /// HTTP方法中: 
        /// PUT相当于Create 
        /// GET相当于Read 
        /// POST相当于Update 
        /// DELETE相当于Delete 
        /// </remarks> 

        [ServiceContract] 
         public  interface IREST 
        { 
                 /// <summary> 
                 /// 创建用户 
                 /// </summary> 
                 /// <param name="name">用户名</param> 
                 /// <param name="dayOfbirth">生日</param> 
                 /// <remarks> 
                /// WebInvoke - 指示服务操作在逻辑上就是调用操作,而且可由 Web 编程模型调用 
                /// UriTemplate - 用于服务操作的统一资源标识符 (URI) 模板。URI模板可以将一个 URI 或一组 URI 映射到服务操作。有关 URI 模板的更多信息,请参见 UriTemplate 和 UriTemplateTable 
                /// Method - 与操作关联的协议方法,默认为 POST 
                /// ResponseFormat - 指定从服务操作发出的响应的格式。Xml 或 Json 
                /// </remarks> 

                [OperationContract] 
                [WebInvoke( 
                        UriTemplate =  "User/{name}/{dayOfbirth}"
                        Method =  "PUT"
                        ResponseFormat = WebMessageFormat.Json)] 
                User CreateUser( string name,  string dayOfbirth); 
 
                 /// <summary> 
                 /// 获取用户信息 
                 /// </summary> 
                 /// <param name="name">用户名</param> 
                 /// <remarks> 
                /// WebGet - 指示服务操作在逻辑上就是检索操作,而且可由 Web 编程模型调用 
                /// </remarks> 

                [OperationContract] 
                [WebGet( 
                        UriTemplate =  "User/{name}"
                        ResponseFormat = WebMessageFormat.Json)] 
                User GetUser( string name); 
 
                 /// <summary> 
                 /// 更新用户信息 
                 /// </summary> 
                 /// <param name="name">用户名</param> 
                 /// <param name="dayOfbirth">生日</param> 
                 /// <returns></returns> 
                [OperationContract] 
                [WebInvoke(UriTemplate =  "User/{name}/{dayOfbirth}"
                        Method =  "POST"
                        ResponseFormat = WebMessageFormat.Json)] 
                 bool UpdateUser( string name,  string dayOfbirth); 
 
                 /// <summary> 
                 /// 删除用户信息 
                 /// </summary> 
                 /// <param name="name">用户名</param> 
                 /// <returns></returns> 
                [OperationContract] 
                [WebInvoke( 
                        UriTemplate =  "User/{name}"
                        Method =  "DELETE"
                        ResponseFormat = WebMessageFormat.Json)] 
                 bool DeleteUser( string name); 
        } 
}
REST.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
 
using System.ServiceModel; 
 
namespace WCF.ServiceLib.Web 

         /// <summary> 
         /// 演示REST(Representational State Transfer)的类 
         /// </summary> 
         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) 
                { 
                         return  true
                } 
        } 
}
 
 
2、宿主
REST.svc
<%@ ServiceHost Language="C#" Debug="true" Service="WCF.ServiceLib.Web.REST" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>
 
注:System.ServiceModel.Activation.WebServiceHostFactory - 用于承载使用 WCF Web 编程模型的服务

Web.config
<?xml version="1.0"?> 
<configuration> 
        <system.serviceModel> 
                <behaviors> 
                        <serviceBehaviors> 
                                <behavior name="WebBehavior"> 
                                        <!--httpGetEnabled - 指示是否发布服务元数据以便使用 HTTP/GET 请求进行检索,如果发布 WSDL,则为 true,否则为 false,默认值为 false--> 
                                        <serviceMetadata httpGetEnabled="true" /> 
                                </behavior> 
                        </serviceBehaviors> 
                        <endpointBehaviors> 
                                <behavior name="RESTBehavior"> 
                                        <!--webHttp - 启用 WCF 服务的 Web 编程模型--> 
                                        <webHttp /> 
                                </behavior> 
                        </endpointBehaviors> 
                </behaviors> 
                <services> 
                        <!--name - 提供服务的类名--> 
                        <!--behaviorConfiguration - 指定相关的服务行为配置--> 
                        <service name="WCF.ServiceLib.Web.REST" behaviorConfiguration="WebBehavior"> 
                                <!--address - 服务地址--> 
                                <!--binding - 通信方式--> 
                                <!--contract - 服务契约--> 
                                <!--behaviorConfiguration - 指定相关的端点行为配置--> 
                                <endpoint address="" binding="webHttpBinding" contract="WCF.ServiceLib.Web.IREST" behaviorConfiguration="RESTBehavior" /> 
                        </service> 
                </services> 
        </system.serviceModel> 
</configuration>
 
3、客户端
REST.aspx
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="REST.aspx.cs" 
        Inherits="Web_REST" Title="WCF创建REST" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server"> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> 
        <asp:Label ID="lblMsg" runat="server" /> 
</asp:Content>
 
REST.aspx.cs
using System; 
using System.Collections; 
using System.Configuration; 
using System.Data; 
using System.Linq; 
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}<br />{1}<br />{2}<br />{3}"
                        create, 
                        read, 
                        update, 
                        delete); 
        } 
}
 

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



示例(使用asp.net ajax调用WCF服务) 
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 

         /// <summary> 
         /// User实体类 
         /// </summary> 
        [DataContract] 
         public  class User 
        { 
                 /// <summary> 
                 /// 用户名 
                 /// </summary> 
                [DataMember(Order = 0)] 
                 public  string Name { get; set; } 
 
                 /// <summary> 
                 /// 生日 
                 /// </summary> 
                [DataMember(Order = 1)] 
                 public DateTime DayOfbirth { get; set; } 
        } 
 
}
IAJAX.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
 
using System.ServiceModel; 
 
namespace WCF.ServiceLib.Web 

         /// <summary> 
         /// 演示AJAX的接口 
         /// </summary> 
        [ServiceContract(Namespace =  "WCF")] 
         public  interface IAJAX 
        { 
                 /// <summary> 
                 /// 获取用户 
                 /// </summary> 
                 /// <param name="name">用户名</param> 
                 /// <returns></returns> 
                [OperationContract] 
                User GetUser( string name); 
        } 
}
 
AJAX.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
 
using System.ServiceModel; 
using System.ServiceModel.Activation; 
 
namespace WCF.ServiceLib.Web 

         /// <summary> 
         /// 演示AJAX的类 
         /// </summary> 
         /// <remarks> 
        /// ASP.NET 兼容性模型: 
        /// 如果在负载平衡或者甚至 Web 园的环境中承载 WCF 服务,并且在该环境中后续的会话请求可以被此环境内的不同宿主或进程处理,则需要对会话状态进行进程外持久存储。最新的 WCF 不支持会话状态的持久存储。相反,WCF 将它的所有会话状态存储在内存中。如果在 IIS 中承载 WCF 服务,最后可以使用回收方案。 
        /// WCF 依赖于会话状态的 ASP.NET 实现,而不是为会话全部再次建立持久存储。此方式有一个严重的限制:使服务仅限于 HTTP 
        /// ASP.NET 会话状态不是受 ASP.NET 兼容性模式支持的唯一功能。它还支持诸如 HttpContext、globalization 和模拟等功能,就像用于 ASP.NET Web 服务 (ASMX) 一样 
        /// </remarks> 

         /// [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
         public  class AJAX : IAJAX 
        { 
                 public User GetUser( string name) 
                { 
                         return  new User { Name = name, DayOfbirth =  new DateTime(1980, 2, 14) }; 
                } 
        } 
}
 
 
2、宿主
AJAX.svc
<%@ ServiceHost Language="C#" Debug="true" Service="WCF.ServiceLib.Web.AJAX" Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory" %>
 
注:System.ServiceModel.Activation.WebScriptServiceHostFactory  - 能够向服务中自动添加 ASP.NET AJAX 终结点而无需进行配置

Web.config
<?xml version="1.0"?> 
<configuration> 
        <system.serviceModel> 
                <behaviors> 
                        <serviceBehaviors> 
                                <behavior name="WebBehavior"> 
                                        <!--httpGetEnabled - 指示是否发布服务元数据以便使用 HTTP/GET 请求进行检索,如果发布 WSDL,则为 true,否则为 false,默认值为 false--> 
                                        <serviceMetadata httpGetEnabled="true" /> 
                                </behavior> 
                        </serviceBehaviors> 
                        <endpointBehaviors> 
                                <behavior name="AJAXBehavior"> 
                                        <!--enableWebScript - 启用 WCF 服务的 脚本 编程模型--> 
                                        <enableWebScript /> 
                                </behavior> 
                        </endpointBehaviors> 
                </behaviors> 
                <services> 
                        <!--name - 提供服务的类名--> 
                        <!--behaviorConfiguration - 指定相关的服务行为配置--> 
                        <service name="WCF.ServiceLib.Web.AJAX" behaviorConfiguration="WebBehavior"> 
                                <!--address - 服务地址--> 
                                <!--binding - 通信方式--> 
                                <!--contract - 服务契约--> 
                                <!--behaviorConfiguration - 指定相关的端点行为配置--> 
                                <endpoint address="" binding="webHttpBinding" contract="WCF.ServiceLib.Web.IAJAX" behaviorConfiguration="AJAXBehavior" /> 
                        </service> 
                </services> 
        </system.serviceModel> 
</configuration>
 
 
3、客户端
Demo.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Demo.aspx.cs" Inherits="Demo" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
        <title>AJAX调用WCF</title> 
</head> 
<body> 
        <form id="form1" runat="server"> 
                 <asp:ScriptManager ID="ScriptManager1" runat="server"> 
                        <Services> 
                                <asp:ServiceReference Path="Service/AJAX.svc" /> 
                        </Services> 
                </asp:ScriptManager> 
                <asp:Label ID="lblMsg" runat="server" /> 
                <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> 
        </form> 
</body> 
</html>
 
 
运行结果:
姓名:webabcd
生日:1980-02-14


OK
[源码下载]

     本文转自webabcd 51CTO博客,原文链接: http://blog.51cto.com/webabcd/344176 ,如需转载请自行联系原作者



相关文章
|
2月前
|
XML 前端开发 JavaScript
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
60 3
|
2月前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
60 1
|
3月前
|
JavaScript API 开发工具
(H5-Web3D-ThreeJS)在网页三维CAD中绘制窗户模型
本文介绍了如何使用mxcad3d在网页中创建一个简单的三维窗户模型。通过官方教程搭建环境,编写绘制窗户模型的代码,并在点击按钮后展示模型效果。最终模型包括窗框和玻璃部分,具备丰富的三维建模功能和便捷的API支持。
|
3月前
|
机器学习/深度学习 监控 数据挖掘
基于Django和百度飞桨模型的情感识别Web系统
基于Django和百度飞桨模型的情感识别Web系统
55 5
|
3月前
|
前端开发 JavaScript API
惊呆了!学会AJAX与Fetch API,你的Python Web项目瞬间高大上!
在Web开发领域,AJAX与Fetch API是提升交互体验的关键技术。AJAX(Asynchronous JavaScript and XML)作为异步通信的先驱,通过XMLHttpRequest对象实现了局部页面更新,提升了应用流畅度。Fetch API则以更现代、简洁的方式处理HTTP请求,基于Promises提供了丰富的功能。当与Python Web框架(如Django、Flask)结合时,这两者能显著增强应用的响应速度和用户体验,使项目更加高效、高大上。
59 2
|
3月前
|
前端开发 API 开发者
从零到精通,AJAX与Fetch API让你的Python Web前后端交互无所不能!
从零到精通,AJAX与Fetch API让你的Python Web前后端交互无所不能!
51 3
|
3月前
|
前端开发 API 数据格式
颠覆传统!AJAX、Fetch API与Python后端,开启Web开发新篇章!
在Web开发领域,技术的快速迭代推动着应用不断进化。传统前后端交互方式已无法满足现代Web应用对高效、实时性和用户体验的需求。AJAX作为异步通信的先驱,使页面无需刷新即可更新部分内容,显著提升用户体验;尽管XML曾是其主要数据格式,但如今JSON已成为主流。Fetch API则以其简洁、灵活的特点成为AJAX的现代替代品,基于Promises的异步请求让开发更加高效。与此同时,Python后端凭借高效稳定和丰富的库支持,成为众多开发者的首选,无论是轻量级的Flask还是全功能的Django,都能为Web应用提供强大的支撑。
48 0
|
3月前
|
XML 前端开发 API
惊艳全场的秘诀!AJAX、Fetch API与Python后端,打造令人惊叹的Web应用!
惊艳全场的秘诀!AJAX、Fetch API与Python后端,打造令人惊叹的Web应用!
39 0
|
4月前
|
存储 API Go
使用动态模型创建web应用
【9月更文挑战第5天】动态模型描述系统中对象间的交互和状态变化,重点关注事件驱动的行为。时序图清晰展示了请求处理流程,状态图则描绘了系统状态的转换过程。
68 9
|
4月前
|
Java API Apache
从零到英雄的蜕变:如何用Apache Wicket打造你的第一个Web应用——不仅是教程,更是编程之旅的启航
【9月更文挑战第4天】学习Apache Wicket这一开源Java Web应用框架是一段激动人心的旅程。本文将指导你通过Maven搭建环境,并创建首个“Hello, World!”应用。从配置`pom.xml`到实现`HelloWorldApplication`类,再到`web.xml`的设置,一步步教你构建与部署简单网页。适合初学者快速上手,体验其简洁API与强大组件化设计的魅力。
105 1