化零为整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 ,如需转载请自行联系原作者



相关文章
|
开发框架 监控 .NET
Visual Basic的Web服务和REST API开发指南
【4月更文挑战第27天】本文探讨了使用Visual Basic(VB.NET)构建Web服务和RESTful API的方法。首先介绍了Web服务的基础和REST API的概念,然后阐述了.NET Framework与.NET Core/.NET 5+对VB.NET的支持,以及ASP.NET Core在Web开发中的作用。接着,详细讲解了创建RESTful API的步骤,包括控制器与路由设置、模型绑定与验证,以及返回响应。此外,还讨论了安全措施、测试方法、部署选项和监控策略。最后强调,VB.NET开发者可以通过ASP.NET Core涉足现代Web服务开发,拓宽技术领域。
619 1
|
中间件 关系型数据库 数据库
docker快速部署OS web中间件 数据库 编程应用
通过Docker,可以轻松地部署操作系统、Web中间件、数据库和编程应用。本文详细介绍了使用Docker部署这些组件的基本步骤和命令,展示了如何通过Docker Compose编排多容器应用。希望本文能帮助开发者更高效地使用Docker进行应用部署和管理。
449 19
|
机器学习/深度学习 开发框架 API
Python 高级编程与实战:深入理解 Web 开发与 API 设计
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化、调试技巧以及数据科学和机器学习。本文将深入探讨 Python 在 Web 开发和 API 设计中的应用,并通过实战项目帮助你掌握这些技术。
|
Java API Apache
从零到英雄的蜕变:如何用Apache Wicket打造你的第一个Web应用——不仅是教程,更是编程之旅的启航
【9月更文挑战第4天】学习Apache Wicket这一开源Java Web应用框架是一段激动人心的旅程。本文将指导你通过Maven搭建环境,并创建首个“Hello, World!”应用。从配置`pom.xml`到实现`HelloWorldApplication`类,再到`web.xml`的设置,一步步教你构建与部署简单网页。适合初学者快速上手,体验其简洁API与强大组件化设计的魅力。
553 1
|
存储 关系型数据库 MySQL
PHP编程基础:构建你的第一个Web应用
【8月更文挑战第31天】 在数字时代的海洋里,每个人都可以成为自己命运的船长。本文将引领初学者启航,用PHP语言搭建起第一个属于自己的网站。我们将从浅入深,逐步探索PHP的世界,最终实现一个简单的个人博客系统。这不仅是一段代码的旅程,更是一次思维和技术的飞跃。
|
开发者 Python
神秘编程世界惊现强大调试法宝!FastAPI 究竟藏着怎样的秘密?带你解决 Web 应用问题大揭秘!
【8月更文挑战第31天】在 Web 应用开发中,调试至关重要,有助于迅速定位并解决问题,确保应用稳定运行。不同于传统框架依赖打印日志和手动检查代码的方式,FastAPI 作为现代 Python Web 框架,提供了内置开发服务器和自动重载功能,极大提升了开发效率。结合 Python 调试器,开发者可通过设置断点来逐步执行代码,直观精确地观察变量值与执行流程,快速定位问题。此外,FastAPI 还提供详细错误信息和日志记录,帮助开发者更高效地解决应用问题,提升应用质量。
336 1
|
开发框架 安全 .NET
使用VB.NET构建Web服务和REST API的指南
【7月更文挑战第2天】使用VB.NET构建Web服务和REST API的指南:从Web服务基础到ASP.NET Core实践,涵盖控制器、路由、模型绑定、安全措施(如JWT、HTTPS)及测试、部署(Azure、Docker)与监控工具。了解如何利用VB.NET在现代云环境中创建高效、安全的API。开始你的VB.NET Web服务开发之旅!**
792 1
|
前端开发 JavaScript 开发工具
Web网页前端教程免费:引领您踏入编程的奇幻世界
Web网页前端教程免费:引领您踏入编程的奇幻世界
209 3
|
开发框架 安全 网络协议
27.Python Web 编程基础
27.Python Web 编程基础
214 3
|
开发框架 开发工具 Java
从零到高手:一文教你快速上手Vaadin,打造首个炫酷Web应用,开启编程新世界的大门
【8月更文挑战第31天】Vaadin是一款基于Java的Web应用开发框架,以其丰富的组件库、简洁的API及对现代Web标准的支持而广受开发者欢迎。本文将指导你从零开始快速搭建一个简单的Vaadin应用。首先确保已安装JDK 11及以上版本和IDE(如IntelliJ IDEA或Eclipse)。接着使用Spring Initializr创建新项目,并选中“Spring Web”和“Vaadin”依赖。创建项目后,编写主应用类和主页类,实现基本页面功能。最后配置启动页面并运行应用。通过这些步骤,你将成功搭建一个基础Vaadin应用,开启探索更多特性的旅程。
2055 0