经过前面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. 如何在 Swift 中优雅地处理 JSON

    阅读目录 在Swift中使用JSON的问题 开始 基础用法 枚举(Enumeration) 下标(Subscripts) 打印 调试与错误处理 后记   因为Swift对于类型有非常严格的控制,它在处 ...

  2. jconsole 连接 eclipse启动项

    eclipse 启动java项目默认情况下不开启jmx远程观看,假设需要看看内存使用情况对项目执行的线程等信息,能eclipse添加启动参数: -Dcom.sun.management.jmxremo ...

  3. 解决IIS7中出现An error occurred on the server when processing the URL错误提示的方法

    在IIS7上配置一个asp程序,出现了一个错如提示: An error occurred on the server when processing the URL. Please contact t ...

  4. 【Android进阶】ZXing android 错误(Could not find class 'com.google.zxing.ResultPoint)

    解决方法: 1.右键工程Build path, java build path,选择libraries 在右边的按钮中点击"Add Library" 选择"User li ...

  5. 无法使用Django新建项目:&#39;django-admin.py&#39;不是内部或外部命令

    问题: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbXlhdGxhbnRpcw==/font/5a6L5L2T/fontsize/400/fill/I0 ...

  6. 鸟哥Linux私房菜 基础学习篇读书笔记(10):Linux磁盘和文件系统管理(3)

    本文总结了Linux操作系统来管理我们的硬盘和文件系统需要使用命令.当我们在系统中增加一个硬盘驱动器.什么是我们需要去通过这个硬盘就可以真正使用步骤?下面步骤: (1)对磁盘进行分区,新建能够使用的分 ...

  7. mahout安装和测试

    Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发者更加方便快捷地创建智能应用程序.Apac ...

  8. HTML5学习笔记简明版(10):过时的元素和属性

    被遗弃的元素(Element) 这个小节里列出的元素在HTML5里将不再使用,现有文档升级到 HTML5的话能够使用一些替代方案.比如parser section 能够处理isindex 元素的功能. ...

  9. iOS_21团购_发送请求【点评】数据

    结果表明,一个简单的请求: 用到的点评封装的类: 使用tableView简单展示: // // DealListController.m // 帅哥_团购 // // Created by beyon ...

  10. httpclient发送不带参数post数据

    两个问题:      1.httpclient怎样发送一个没有不论什么參数的post数据呢?      2.Webproject怎样去接收一个无參数的post呢? 起因:      今天(2014.1 ...