经过前面3天的学习,我想大家应该对SOA的架构有了初步的了解,其实 SOA与三层架构并不冲突,而是三层架构的升级版。

来看下传统的三层架构! 一共可以分为4个层: 模型层(可有可无),客户端,服务端,公共层。

我们在原有的三层架构的基础上,我们增加一个服务中转层! 然后客户端 通过 调用 服务中转,然后在调用  服务层,因为客户端可以有多个,可以是安卓,可以是IOS,

可以是电脑,可以是linux, 因为这个不管是什么样的语言和系统,她们都支持JSON以及xml。

如下图:(common:公共层,DataServer服务层,wcf服务中转层,webClient  web 客户端)

接下我们来看下关键代码处: (下面有对应的源代码下载)

来看下如何通过 通用查询 来查询数据的流程:

首先 前台通过 ajax 的访问我们的   svc 文件,来进行访问:

1.这里需要注意的是, ajax 使用 get 和post 时,传入json的格式是不一样的。

  var s = '{ "aa":"' + $("#txt_data").val() + '"}';
$.postwcf = function (database,
method, //操作的方法名字
sql, //sql语句或者传入的 数据
success, //执行成功所返回的方法
err) { //执行失败所返回的方法
var url = $.getrooturl() + "/WebService.svc/operate";
var data;
if (sql.indexOf("{")> && sql.indexOf('"')> && sql.indexOf("}")>) {
data = {
"database": database,
"method": method,
"sql": JSON.stringify(sql),
};
} else {
data = {
"database": database,
"method": method,
"sql":sql,
};
} $.ajax({
url: url,
contentType: "application/json;charset=utf-8",
data: JSON.stringify(data),
type: "post",
success: function (data) {
success(data);
},
error: function (error) {
err(error);
}
}); }

上面这个 post的方法, json 格式需要 ' {"aa":"123"} '
西面这个是get的方法,json格式为    {"aa":"123"}

很显然,一个传入json格式是需要引号才能辨认,一个这不需要引号进行辨认。

$.getwcf = function (database,
method, //操作的方法名字
sql, //sql语句或者传入的 数据
success, //执行成功所返回的方法
err) { //执行失败所返回的方法
var url = $.getrooturl() + "/WebService.svc/operateByGet";
var data;
if (sql.indexOf("{") > && sql.indexOf('"') > && sql.indexOf("}") > ) {
data = {
"database": database,
"method": method,
"sql": JSON.stringify(sql),
};
} else {
data = {
"database": database,
"method": method,
"sql": sql,
};
} $.ajax({
url: url,
contentType: "application/json;charset=utf-8",
data:data,
type: "get",
success: function (data) {
success(data);
},
error: function (error) {
err(error);
}
}); }

2.另外我们的后台,对应的 契约,也就是接口需要注意的就是:
我们可以看到,我们可以看到我们写了2个接口,一个是需要用 POST

调用的,一个是需要用get 调用的,其实2个所执行的方法都是一样的。WebInvoke对应的是post,WebGet对应的是get的调用。

[ServiceContract]
interface ISqlServer
{
/// <summary>
/// 这里指所执行的操作(其中保证 sql 语句)
/// </summary>
/// <param name="database">数据库的名字</param>
/// <param name="operate">所执行的操作,select ,insert,delete</param>
/// <param name="method">方法名</param>
/// <param name="sql">sql语句</param>
/// <returns>返回数据类型为json格式</returns>
[OperationContract]
[WebInvoke(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
string operate(string database, string method, string sql);
[WebGet(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
string operateByGet(string database, string method, string sql); }

3.实现原有类的方法扩展,例如 在datatable的基础上 增加一个 .toJson的方法:如何来写呢?

 public static class Extend
{
/// <summary>
/// 这是将 datatable转化为json的方法
/// </summary>
/// <param name="pData"></param>
/// <returns></returns>
public static string ToJson(this DataTable pData)
{
//这里就可以来写你的代码了
}

注意 必须 是静态类中的静态方法,参数中 带有 this 关键字

4.实现一种反射能够 通过 指定  命名空间,类名,方法名, 参数,就能够执行对应的 方法(静态 与非静态都能执行)

  /// <summary>
/// 根据字符执行该方法
/// </summary>
/// <param name="path">命名空间</param>
/// <param name="className">类名</param>
/// <param name="MethodName">方法名</param>
/// <param name="dic">传入的参数</param>
/// <returns>返回object类型</returns>
public static object Execute(string path, string className, string MethodName, Dictionary<string,object> dic)
{ object[] parameters=new object[];
parameters[] = dic;
//动态从程序集中查找所需要的类并使用系统激活器创建实例最后获取它的Type
Type type = Assembly.Load(path).CreateInstance(path + "." + className).GetType();
//定义参数的个数,顺序以及类型的存储空间;
Type[] parametersLength;
if (parameters != null) //表示方法的参数不为空才执行
{
parametersLength = new Type[parameters.Length];
int i = ;
foreach (object obj in parameters)
{
parametersLength.SetValue(obj.GetType(), i);
i++;
}
}
else
{
//没有参数就为空
parametersLength = new Type[];
}
//然后我们来查找制定的方法 MethodInfo methodinfo = type.GetMethod(MethodName, parametersLength);
if (methodinfo.IsStatic)
{ return methodinfo.Invoke(null, parameters);
}
else
{
object obj = Activator.CreateInstance(type);
//表示不属于静态方法的调用
return methodinfo.Invoke(obj, parameters);
}
}

注意 看到  执行方法 时 要 分 静态 与非静态,静态时 不用实例化对象,否则就得 实例化对象。

5.另外我还附上,  json 与字典方法的相互转换:

  /// <summary>
/// 这是将 json 转成 dictionary 的方法
/// </summary>
/// <param name="JsonData"></param>
/// <returns></returns>
public static Dictionary<string, object> ToDictionary(this string JsonData)
{
object Data = null;
Dictionary<string, object> Dic = new Dictionary<string, object>();
if (JsonData.StartsWith("["))
{ //如果目标直接就为数组类型,则将会直接输出一个Key为List的List<Dictionary<string, object>>集合 21. //使用示例
List<Dictionary<string, object>> ListDic = (List<Dictionary<string, object>>)Dic["List"];
List<Dictionary<string, object>> List = new List<Dictionary<string, object>>();
MatchCollection ListMatch = Regex.Matches(JsonData, @"{[\s\S]+?}");//使用正则表达式匹配出JSON数组 24.
foreach (Match ListItem in ListMatch)
{
List.Add(ToDictionary(ListItem.ToString()));//递归调用
}
Data = List;
Dic.Add("List", Data); }
else
{
MatchCollection Match = Regex.Matches(JsonData, @"""(.+?)"": {0,1}(\[[\s\S]+?\]|null|"".+?""|-{0,1}\d*)");//使用正则表达式匹配出JSON数据中的键与值
foreach (Match item in Match)
{ if (item.Groups[].ToString().StartsWith("["))
{ //如果目标是数组,将会输出一个Key为当前Json的List<Dictionary<string, object>>集合
List<Dictionary<string, object>> ListDic = (List<Dictionary<string, object>>)Dic["Json中的Key"];
List<Dictionary<string, object>> List = new List<Dictionary<string, object>>();
MatchCollection ListMatch = Regex.Matches(item.Groups[].ToString(), @"{[\s\S]+?}");//使用正则表达式匹配出JSON数组
foreach (Match ListItem in ListMatch)
{
List.Add(ToDictionary(ListItem.ToString()));//递归调用
}
Data = List;
}
else if (item.Groups[].ToString().ToLower() == "null")
Data = null;//如果数据为null(字符串类型),直接转换成null
else Data = item.Groups[].ToString(); //数据为数字、字符串中的一类,直接写入
Dic.Add(item.Groups[].ToString(), Data); } }
return Dic;
}

6.另外其他的 东西,在前面的章节中有讲过,不过wcf的原理看以简单的介绍下:
   首先,通过ajax 请求 wcf 服务,然后进入到wcf服务后台,验证该方法名是否存在,如果 存在 则直接执行该方法名,

否则通过 反射 寻找到该方法执行。返回string的json格式。直接传输到前台。这样就可以达到 前台与 后台直接进行交互,而去掉了繁杂的

C#调用后台的方法。

另外附上VS2012的源代码:

http://files.cnblogs.com/files/liujing379069296/MySOA.rar

(说明:只需要修改web.config 中的连接字符串,然后写入 你对应数据库的sql语句就可以使用了)

jquery 调用wcf 的SOA架构,将三层架构运用到SOA的架构中来(第四天)的更多相关文章

  1. 抛弃WebService,在.NET4中用 jQuery 调用 WCF

    在我们之前的开发中,对于ajax程序,都是通过jQuery调用标记为[System.Web.Script.Services.ScriptService]的WebService,然后在WebServic ...

  2. VS2010中使用Jquery调用Wcf服务读取数据库记录

    VS2010中使用Jquery调用Wcf服务读取数据库记录 开发环境:Window Servere 2008 +SQL SERVE 2008 R2+ IIS7 +VS2010+Jquery1.3.2 ...

  3. jQuery调用WCF需要注意的一些问题

    昨天,博客园首页增加了Digg功能.在该功能中我们开始尝试使用jQuery直接调用WCF.之前我们采用的方案是jQuery调用Web Service,然后WebService再调用服务层.这样调用主要 ...

  4. JQuery调用WCF服务,部署在iis

    Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable ...

  5. jQuery调用WCF

    jQuery要调用WCF,首先要创建service.svc服务文件,这里边需要注意: [ServiceContract(Namespace = "")] [AspNetCompat ...

  6. jquery调用wcf案例

    ----------根据其他网友总结 1.在契约接口上添加:[WebInvoke(RequestFormat=WebMessageFormat.Json,ResponseFormat=WebMessa ...

  7. jQuery调用WCF服务传递JSON对象

    下面这个示例使用了WCF去创建一个服务端口从而能够被ASP.Net页面通过jQuery的AJAX方法访问,我们将在客户端使用Ajax技术来 与WCF服务进行通信.这里我们仅使用jQuery去连接Web ...

  8. JQuery调用WCF服务

    一:创建一个wcf服务项目 [ServiceContract] public interface IService1 { [OperationContract] [WebInvoke(RequestF ...

  9. jQuery调用WCF 说明

    在项目中用过一些WCF的技术这篇文章是对以前用过的一点东西的一个梳理 一,webconfig的配置除了一般的配置外,与WCF相关的配置如下 <system.serviceModel>    ...

随机推荐

  1. 【iOS】Web Color 的 Swift 实现

    用Swift语言重写Web Color这个类. 这次是用函数实现的,感觉也非常简洁.眼下(2014.6.28) Xcode 6的方法提示还不健全,就仅仅实现了用颜色名字创建颜色的功能. 最新代码&am ...

  2. Lock_sga 和 pre_page_sga 参数详解

    Lock_sga 和 pre_page_sga 参数详解        Lock_sga 和pre_page_sga,是两个平时用的不算太多的参数,但是这两个参数平时在优化的时候可能给你带来比较乐观的 ...

  3. FPGA合成编码

    1 决策树 于FPGA推断使用if else报表及case达到. a) if else 是有特权的,类似于优先编码(当两个条件同一时候成立,仅推断条件靠前的成立),所以当有特权条件时应该採用if el ...

  4. Linux环境Eclipse + Tomcat + MySQL 构造J2EE方法开发环境

    1. 版本号信息 (1)CentOS 6.4释64位置.uname -a 下面的示例演示显著样本: Linux localhost.localdomain 3.11.6 #1 SMP Sat Nov ...

  5. [HA]负载均衡:HAPROXY与KEEPALIVED强强联合

    第一步:更改系统控制配置文件,同意分配虚拟IP(VIP) /etc/sysctl.conf net.ipv4.ip_nonlocal_bind=1 <pre style="word-w ...

  6. 淘宝异构数据源数据交换工具 DataX

    淘宝异构数据源数据交换工具 DataX 阅读目录 DataX是什么? DataX用来解决什么? DataX特点? DataX结构模式(框架+插件) DataX在淘宝的运用 DataX是什么? Data ...

  7. RH253读书笔记(8)-Lab 8 Securing Data

    Lab 8 Securing Data Goal: Gain familiarity with encryption utilities Sequence 1: Using SSH keys with ...

  8. 在InstallShield中发布单一的Setup.exe文件

    原文:在InstallShield中发布单一的Setup.exe文件 InstallShield默认的Release模式下,生成了一个setup.exe文件,一个msi文件,以及一些其它的杂项文件. ...

  9. hibernate 单元測试框架

    hibernate在写数据库配置文件时很的不确定,必须进行必要的測试保证数据库结构的正确性.所以能够应用junit进行測试. 使用junit很easy,eclipse仅仅须要右键项目新建一个junit ...

  10. DTD验证XML(转)

    1.内部DTD       最简单的使用DTD的方法是在XML文件的序言部分加入一个DTD描述,加入的位置是紧接在XML处理指示之后.一个包含DTD的XML文件的结构为:    <?xml ve ...