经过前面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. zoj 2156 - Charlie&#39;s Change

    称号:拼布钱,表面值至1,5.10.25.寻求组成n表面值硬币的最大数目. 分析:dp,01背包.需要二元分割,除此以外TLE.使用每个硬币的数组记录数.轻松升级. 写了一个 多重背包的 O(NV)反 ...

  2. HDU 1864最大报销额(一维背包)

    题目地址:HDU 1864 刚上来看着挺麻烦的..细致看了看原来好简单好简单...仅仅要去掉一些不符合要求的发票,剩下的就是最简单的背包问题了..对于小数问题,仅仅要*100就变成整数了. 代码例如以 ...

  3. 【cocos2d-x】尝鲜 Cocos Code IDE(不断更新)

    Cocos Code IDE 是一个基于 Eclipse 的跨平台 IDE ,专门为 cocos2d lua & js 开发者准备,通过此工具.你能够方便的创建游戏project.编写而且调试 ...

  4. 第三章_JSP

    3.1.JSP概述 Jsp页面实在jsp容器中执行的.Servlet容器一般也是JSP容器.比如,Tomcat就是一个Servlet/JSP容器. 第一次请求一个jsp页面时,Servlet/JSP容 ...

  5. 微服务API Gateway

    翻译-微服务API Gateway 原文地址:http://microservices.io/patterns/apigateway.html,以下是使用google翻译对原文的翻译. 让我们想象一下 ...

  6. bootstrap使用汇总

    //大多数功能都能够指定data属性来指定 但是,有必要的情况下使用jquery由于事件是不同的过程 //活动通常有两种状态show shown 通用和过去的 <!DOCTYPE html> ...

  7. IE不能上网、有道云笔记不能联网、各种软件主页不能联网解决办法一

    其他的办法我几乎都试过了,读者可以无搜一下,我的问题是,我用Lantern.exe,所以只要打开这个就可以了! 我一直不知道是这个问题,困扰了好久QAQ

  8. apache kafka系列之-监控指标

    apache kafka中国社区QQ群:162272557 1.监控目标 1.当系统可能或处于亚健康状态时及时提醒,预防故障发生 2.报警提示 a.短信方式 b.邮件 2.监控内容 2.1 机器监控 ...

  9. html 块状元素 行内元素 内联元素

    块状(Block)类型的元素的width默认为100%,而行内(Inline)类型的元素则是根据自身的内容及子元素来决定宽度. 块元素(block element) address - 地址 bloc ...

  10. MVC的验证 jquery.validate.unobtrusive

    jQuery validate 根据 asp.net MVC的验证提取简单快捷的验证方式(jquery.validate.unobtrusive.js) 2013-07-22 19:07 4568人阅 ...