一起谈.NET技术,使用WCF实现SOA面向服务编程——使用AJAX+WCF服务页面开发

简介:   在上一篇讲到,如果将BLL层的每一个类都转化为*.svc,这是一个不实在的想法。它会使服务变化复杂,难于管理。  这时候,我们第一时间想到的是23个简单开发模式中的Factory,在这里,Factory正好派上用场。

  在上一篇讲到,如果将BLL层的每一个类都转化为*.svc,这是一个不实在的想法。它会使服务变化复杂,难于管理。

  这时候,我们第一时间想到的是23个简单开发模式中的Factory,在这里,Factory正好派上用场。我们把这个Factory称之为管道(pipeline) ,通过这个管道客户端可以随意调用服务器BLL层里面的类。

  (关于管道的概念,建议参考Cory Isaacson的杰作《多核应用架构关键技术—软件管道与soa》)

  当你使用B/S方式开发UI层时,只要了解此开发模式,使用Ajax加上WCF里面的WebHttpBinding绑定和WebHttpBehavior行为,可以说是天衣无缝的组合。

  首先,开发一个数据契约,其中包括程序集名称,类名,构造函数的参数,方法名,方法中的参数:

 
 
[DataContract]
public class Communication
{
[DataMember]
public string Assembly
{
get ;
set ;
}
[DataMember]
public string Class
{
get ;
set ;
}
[DataMember]
public object [] ConstructedParameters
{
get ;
set ;
}
[DataMember]
public string Method
{
get ;
set ;
}
[DataMember]
public object [] Parameters
{
get ;
set ;
}
}

  为了证明客户端可以通过Ajax能够直接调用服务器WCF,我们先开发一个MyAssembly程序集:

 
 
namespace MyAssembly
{

[DataContract]
public class User
{
[DataMember]
public int ID
{
get ; set ; }

[DataMember]
public string Name
{
get ; set ; }

[DataMember]
public int Age
{
get ; set ; }
}

public class UserManager
{
public List < User > GetList()
{
List
< User > entities = new List < User > ();
User user
= new User();
user.ID
= 0 ;
user.Age
= 26 ;
user.Name
= " Leslie " ;
entities.Add(user);
return entities;
}
}
}

  好,现在已经做好准备,现在我们新建一个“启动了AJAX的WCF服务”:

 
 
[ServiceContract(Namespace = " myNamespace " )]
[AspNetCompatibilityRequirements(RequirementsMode
= AspNetCompatibilityRequirementsMode.Allowed)]

// 注意必须将RequirementsMode设置为AspNetCompatibilityRequirementsMode.Allowed

public class Service
{
private static Hashtable assemblies = new Hashtable();
private static Hashtable types = new Hashtable();

[OperationContract]
[WebGet]

// 要使用 HTTP GET,请添加 [WebGet] 特性。
public string DoWork(Communication communication)
{
Type classType
= GetType(communication); // 通过自定义的GetType(Communicate o)方法加载类

if (classType != null ) // 下面将利用反射原理创建类对象
{
object reflectedObject;
if (communication.ConstructedParameters != null )
reflectedObject
= Activator.CreateInstance(classType, communication.ConstructedParameters);
else
reflectedObject
= Activator.CreateInstance(classType);

MethodInfo methodInfo
= classType.GetMethod(communication.Method); // 获取方法信息

if (methodInfo != null )
{
object data = methodInfo.Invoke(reflectedObject, communication.Parameters); // 调用方法
if (data != null )
return Formate(data, methodInfo.ReturnType); // 将结果转化为JSON
else
return null ;
}
else
return null ;
}

return null ;
}

// 因为结果供于Ajax页面使用,所以将结果转化为Json形式
// 其实当项目已经启动AJAX,在默认情况下结果会自动转化为JSON,但因为不能事先预知返回的类型,所以把返回类型定为String
// 此处手动将结果转换成JSON字符串
public string Formate( object data,Type type)
{
using (Stream stream = new MemoryStream())
{
DataContractJsonSerializer jsonSerializer
= new DataContractJsonSerializer(type);
jsonSerializer.WriteObject(stream, data);
byte [] byteData = new byte [stream.Length];
stream.Seek(
0 , 0 );
stream.Read(byteData,
0 , ( int )stream.Length);
stream.Close();
return Encoding.UTF8.GetString(byteData);
}
}

// 加载程序集  
private Assembly GetAssembly(Communication communication)
{
if ( ! assemblies.ContainsKey(communication.Assembly))
{
Assembly myAssembly
= Assembly.Load(communication.Assembly);
assemblies.Add(communication.Assembly, myAssembly);
}
return (Assembly)assemblies[communication.Assembly];
}
// 加载类
private Type GetType(Communication communication)
{
if ( ! types.ContainsKey(communication.Class))
{
Assembly assembly
= GetAssembly(communication);
types.Add(communication.Class, assembly.GetType(communication.Class));
}
return (Type)types[communication.Class];
}
}

  服务器端会自动为你配置.config文件:

 
 
< system.serviceModel >
  < serviceHostingEnvironment aspNetCompatibilityEnabled ="true" />
  < behaviors >
    < endpointBehaviors >
    < behavior name ="ServiceAspNetAjaxBehavior" >
    < enableWebScript /> //注意启动enableWebScript
  </ behavior >
  </ endpointBehaviors >
  < serviceBehaviors >
    < behavior name ="ServiceBehavior" >
      < serviceMetadata httpGetEnabled ="true" /> //注意此处启动了httpGetEnabled
      < serviceDebug includeExceptionDetailInFaults ="false" />
    </ behavior >
  </ serviceBehaviors >
</ behaviors >
  < services >
  < service name ="Service" behaviorConfiguration ="ServiceBehavior" >
    < endpoint address ="" behaviorConfiguration ="ServiceAspNetAjaxBehavior"
binding
="webHttpBinding " contract ="Service" /> //注意绑定的是webHttpBinding
    < endpoint address ="mex" binding ="mexHttpBinding" contract ="IMetadataExchange" />
  </ service >
  </ services >
  </ system.serviceModel >
</ configuration >

  好吧,现在万事俱备的时候,让我们开发一个测试页面:

 
 
< body >
< form id ="form1" runat ="server" >
< script type ="text/javascript" >
window.onload
= function () {
myNamespace.Service.set_path(
" http://localhost:8080/Service.svc/ " );
var communication = { " Assembly " : " MyAssembly " , " Class " : " MyAssembly.UserManager " ,
        "
ConstructedParameters " : null , " Method " : " GetList " , " Parameters " : null };

// 把Communication参数转化为Json形式
myNamespace.Service.DoWork(communication, OnSucceed, OnFail, null );
}
function OnSucceed(result) {
if (result != null )
alert(result);
}
function OnFail(result) {
alert(result);
}
</ script >
</ form >
</ body >

  测试成功:

  恭喜你终于学会如何使用Ajax+WCF进行页面数据显示了。

  你应该初步了解到如何使用管道Pipeline进行客户端与服务器端的通讯,自此之后,每逢你进行简单的页面开发时都可使用此方式。好处在于页面无 需了解数据是从何处获取的,因为数据存取和页面可以处于不同的线程池,所以这样做可以把服务器压力降到最低。同时你可以使用异步的服务,来进一步提高数据 站点的线程池效率。(异步服务可参考ASP.NET服务器端多线程设计

目录
相关文章
|
3天前
|
开发框架 前端开发 JavaScript
ASP.NET AJAX使用方法概述(三)
ASP.NET AJAX使用方法概述(三)
|
4天前
|
开发框架 缓存 前端开发
安装ASP.NET AJAX (一安装)
安装ASP.NET AJAX (一安装)
|
5天前
|
前端开发 搜索推荐 安全
AJAX和CSR(客户端渲染)是Web开发中常用的两种技术
【5月更文挑战第8天】AJAX提升用户体验,减轻服务器压力,但对搜索引擎不友好且增加开发复杂度,易引发安全问题。CSR提供快速响应和交互性,改善用户体验,但首屏加载慢,搜索引擎支持不足,同样面临安全挑战。两者各有适用场景,需按项目需求选择。
10 0
|
13天前
|
XML 前端开发 JavaScript
【JavaScript技术专栏】JavaScript网络请求与Ajax技术
【4月更文挑战第30天】Ajax是Web开发中实现动态数据更新的关键技术,允许不刷新页面即从服务器获取数据。它结合了HTML/CSS、DOM、XML/JSON和JavaScript。`XMLHttpRequest`是传统的Ajax实现方式,而`fetch` API是现代、简洁的替代选项。Ajax应用实例展示了如何使用fetch在搜索框输入时异步获取并显示结果,提升了用户体验。掌握这些技术对前端开发者至关重要。
|
14天前
|
人工智能 量子技术 C#
【专栏】.NET 开发:开启数字化新时代
【4月更文挑战第29天】.NET开发在数字化新时代中发挥关键作用,借助跨平台能力、高性能和现代编程语言支持,如C#,助力企业实现数字化转型。通过企业级应用开发、移动应用和云计算集成,.NET加速业务流程和提升用户体验。未来,.NET将涉足AI、ML、MR/AR及量子计算,持续推动技术创新和数字化转型。开发者应提升技能,适应高性能需求,把握发展机遇。
|
14天前
|
缓存 监控 算法
【专栏】.NET 开发:实现卓越性能的途径
【4月更文挑战第29天】本文探讨了.NET开发中的性能优化,强调了理解性能问题根源和使用分析工具的重要性。基础优化包括代码优化(如减少计算、避免内存泄漏)、资源管理及选择合适算法。高级策略涉及并行编程、缓存策略、预编译(AOT)和微服务架构。持续性能测试与监控是关键,包括性能测试、监控分析和建立优化反馈循环。开发者应持续学习和实践性能优化,以构建高性能应用。
|
14天前
|
开发框架 .NET C#
【专栏】理解.NET 技术,提升开发水平
【4月更文挑战第29天】本文介绍了.NET技术的核心概念和应用,包括其跨平台能力、性能优化、现代编程语言支持及Web开发等特性。文章强调了深入学习.NET技术、关注社区动态、实践经验及学习现代编程理念对提升开发水平的重要性。通过这些,开发者能更好地利用.NET构建高效、可维护的多平台应用。
|
14天前
|
机器学习/深度学习 vr&ar 开发者
【专栏】.NET 技术:引领开发新方向
【4月更文挑战第29天】本文探讨了.NET技术如何引领软件开发新方向,主要体现在三方面:1) 作为跨平台开发的先锋,.NET Core支持多操作系统和移动设备,借助.NET MAUI创建统一UI,适应物联网需求;2) 提升性能和开发者生产力,采用先进技术和优化策略,同时更新C#语言特性,提高代码效率和可维护性;3) 支持现代化应用架构,包括微服务、容器化,集成Kubernetes和ASP.NET Core,保障安全性。此外,.NET还不断探索AI、ML和AR/VR技术,为软件开发带来更多创新可能。
|
14天前
|
物联网 vr&ar 开发者
【专栏】.NET 技术:为开发注入活力
【4月更文挑战第29天】本文探讨了.NET技术的创新,主要体现在三个方面:1) .NET Core实现跨平台开发革命,支持多种操作系统和硬件,如.NET MAUI用于多平台UI;2) 性能提升与生产力飞跃,C#新特性简化编程,JIT和AOT优化提升性能,Roslyn提供代码分析工具;3) 引领现代化应用架构,支持微服务、容器化,内置安全机制。未来,.NET 7将带来更多新特性和前沿技术整合,如量子计算、AI,持续推动软件开发创新。开发者掌握.NET技术将赢得竞争优势。
|
14天前
|
人工智能 前端开发 Cloud Native
【专栏】洞察.NET 技术的开发趋势
【4月更文挑战第29天】本文探讨了.NET技术的三大发展趋势:1) 跨平台与云原生技术融合,通过.NET Core支持轻量级、高性能应用,适应云计算和微服务;2) 人工智能与机器学习的集成,如ML.NET框架,使开发者能用C#构建AI模型;3) 引入现代化前端开发技术,如Blazor,实现前后端一致性。随着.NET 8等新版本的发布,期待更多创新技术如量子计算、AR/VR的融合,.NET将持续推动软件开发的创新与进步。