jquery 调用wcf 的SOA架构,将三层架构运用到SOA的架构中来(第四天)
经过前面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的架构中来(第四天)的更多相关文章
- 抛弃WebService,在.NET4中用 jQuery 调用 WCF
在我们之前的开发中,对于ajax程序,都是通过jQuery调用标记为[System.Web.Script.Services.ScriptService]的WebService,然后在WebServic ...
- VS2010中使用Jquery调用Wcf服务读取数据库记录
VS2010中使用Jquery调用Wcf服务读取数据库记录 开发环境:Window Servere 2008 +SQL SERVE 2008 R2+ IIS7 +VS2010+Jquery1.3.2 ...
- jQuery调用WCF需要注意的一些问题
昨天,博客园首页增加了Digg功能.在该功能中我们开始尝试使用jQuery直接调用WCF.之前我们采用的方案是jQuery调用Web Service,然后WebService再调用服务层.这样调用主要 ...
- JQuery调用WCF服务,部署在iis
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable ...
- jQuery调用WCF
jQuery要调用WCF,首先要创建service.svc服务文件,这里边需要注意: [ServiceContract(Namespace = "")] [AspNetCompat ...
- jquery调用wcf案例
----------根据其他网友总结 1.在契约接口上添加:[WebInvoke(RequestFormat=WebMessageFormat.Json,ResponseFormat=WebMessa ...
- jQuery调用WCF服务传递JSON对象
下面这个示例使用了WCF去创建一个服务端口从而能够被ASP.Net页面通过jQuery的AJAX方法访问,我们将在客户端使用Ajax技术来 与WCF服务进行通信.这里我们仅使用jQuery去连接Web ...
- JQuery调用WCF服务
一:创建一个wcf服务项目 [ServiceContract] public interface IService1 { [OperationContract] [WebInvoke(RequestF ...
- jQuery调用WCF 说明
在项目中用过一些WCF的技术这篇文章是对以前用过的一点东西的一个梳理 一,webconfig的配置除了一般的配置外,与WCF相关的配置如下 <system.serviceModel> ...
随机推荐
- java提高篇(二)-----理解java的三大特性之继承
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- SpringMVC源码解析- HandlerAdapter - ModelFactory(转)
ModelFactory主要是两个职责: 1. 初始化model 2. 处理器执行后将modle中相应参数设置到SessionAttributes中 我们来看看具体的处理逻辑(直接充当分析目录): 1 ...
- PHP之运用CI用钩子实现URL权限控制————————【Badboy】
<span style="background-color: rgb(247, 252, 255); font-family: Verdana, Arial, Helvetica, s ...
- UVa10000_Longest Paths(最短路SPFA)
解题报告 求最长路. 用SPFA求最长路,初始化图为零,dis数组也为零 #include <iostream> #include <cstdio> #include < ...
- [Aaronyang] 写给自己的WPF4.5 笔记15[AyArc诞生-WPF版本绚丽的环状图,Ay制作,AyWindow强势预览]
原文:[Aaronyang] 写给自己的WPF4.5 笔记15[AyArc诞生-WPF版本绚丽的环状图,Ay制作,AyWindow强势预览] 我的文章一定要做到对读者负责,否则就是失败的文章 -- ...
- 【Andrioid】在Gradle编译时生成一个不同的版本号,动态设置应用程序标题,应用程序图标,更换常数
写项目的时候常常会遇到下面的情况: 1.须要生成測试版本号和正式版本号的apk 2.測试版本号和正式版本号的URL是不一样的 3.測试版本号和正式版本号的包名须要不一致,这样才干安装到同一部手机上面. ...
- object-c计划tips-添加到类对象属性
这个问题从网络包的内容,由于保密问题,我刚才所描述我的业余的想法. 基本的想法: 网络请求,我们应该能够使用基类BaseNetWork, 然后由派生类继承BaseNetWork,并实现一些特殊的方法. ...
- 第十六章——处理锁、阻塞和死锁(3)——使用SQLServer Profiler侦测死锁
原文:第十六章--处理锁.阻塞和死锁(3)--使用SQLServer Profiler侦测死锁 前言: 作为DBA,可能经常会遇到有同事或者客户反映经常发生死锁,影响了系统的使用.此时,你需要尽快侦测 ...
- Android L SDK -- 一些有趣的新功能
一些普通的就不提了,自己查看最新的文档就可以 文档地址 Task locking 功能:让我们在使用一个应用时,能够免受通知(消息)的打搅. 怎样使用:当我们在应用中激活任务锁模式.我们接收到的通知( ...
- leetcode-2 Add Two Numbers 计算两个对应的列表和问题
1.问题描写叙述: You are given two linked lists representing two non-negativenumbers. The digits are sto ...