化零为整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服务开发,拓宽技术领域。
520 1
|
设计模式 存储 前端开发
MVC(模型-视图-控制器)是一种在Web应用程序开发中广泛使用的软件设计模式
【5月更文挑战第12天】MVC模式是Web应用开发中的常见设计模式,将逻辑、数据和界面分离,提升代码可维护性和重用性。模型处理数据逻辑,视图展示数据,控制器协调用户输入与模型视图交互。优点包括代码分离、易维护、可扩展和组件重用,促进高效灵活的开发。
284 2
|
JavaScript API 开发工具
(H5-Web3D-ThreeJS)在网页三维CAD中绘制窗户模型
本文介绍了如何使用mxcad3d在网页中创建一个简单的三维窗户模型。通过官方教程搭建环境,编写绘制窗户模型的代码,并在点击按钮后展示模型效果。最终模型包括窗框和玻璃部分,具备丰富的三维建模功能和便捷的API支持。
|
机器学习/深度学习 监控 数据挖掘
基于Django和百度飞桨模型的情感识别Web系统
基于Django和百度飞桨模型的情感识别Web系统
263 5
|
存储 API Go
使用动态模型创建web应用
【9月更文挑战第5天】动态模型描述系统中对象间的交互和状态变化,重点关注事件驱动的行为。时序图清晰展示了请求处理流程,状态图则描绘了系统状态的转换过程。
248 10
|
机器学习/深度学习 存储 前端开发
实战揭秘:如何借助TensorFlow.js的强大力量,轻松将高效能的机器学习模型无缝集成到Web浏览器中,从而打造智能化的前端应用并优化用户体验
【8月更文挑战第31天】将机器学习模型集成到Web应用中,可让用户在浏览器内体验智能化功能。TensorFlow.js作为在客户端浏览器中运行的库,提供了强大支持。本文通过问答形式详细介绍如何使用TensorFlow.js将机器学习模型带入Web浏览器,并通过具体示例代码展示最佳实践。首先,需在HTML文件中引入TensorFlow.js库;接着,可通过加载预训练模型如MobileNet实现图像分类;然后,编写代码处理图像识别并显示结果;此外,还介绍了如何训练自定义模型及优化模型性能的方法,包括模型量化、剪枝和压缩等。
885 1
|
机器学习/深度学习 JSON API
【Python奇迹】FastAPI框架大显神通:一键部署机器学习模型,让数据预测飞跃至Web舞台,震撼开启智能服务新纪元!
【8月更文挑战第16天】在数据驱动的时代,高效部署机器学习模型至关重要。FastAPI凭借其高性能与灵活性,成为搭建模型API的理想选择。本文详述了从环境准备、模型训练到使用FastAPI部署的全过程。首先,确保安装了Python及相关库(fastapi、uvicorn、scikit-learn)。接着,以线性回归为例,构建了一个预测房价的模型。通过定义FastAPI端点,实现了基于房屋大小预测价格的功能,并介绍了如何运行服务器及测试API。最终,用户可通过HTTP请求获取预测结果,极大地提升了模型的实用性和集成性。
1000 1
|
存储 数据库 开发者
Django Web架构:全面掌握Django模型字段(下)
Django Web架构:全面掌握Django模型字段(下)
288 2
|
开发框架 安全 .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服务开发之旅!**
649 1
|
API UED 开发者
如何在Uno Platform中轻松实现流畅动画效果——从基础到优化,全方位打造用户友好的动态交互体验!
【8月更文挑战第31天】在开发跨平台应用时,确保用户界面流畅且具吸引力至关重要。Uno Platform 作为多端统一的开发框架,不仅支持跨系统应用开发,还能通过优化实现流畅动画,增强用户体验。本文探讨了Uno Platform中实现流畅动画的多个方面,包括动画基础、性能优化、实践技巧及问题排查,帮助开发者掌握具体优化策略,提升应用质量与用户满意度。通过合理利用故事板、减少布局复杂性、使用硬件加速等技术,结合异步方法与预设缓存技巧,开发者能够创建美观且流畅的动画效果。
357 0