引言

随着手机及移动设备的普及,移动端的应用也进入了热潮。以前PC端的门户网站,大多也均推出了适配移动设备的网站或者APP,再差的也注册了个公众号。在移动应用开发中,目前据我所了解到的解决方案有:1、原生态APP开发;2、适配移动设备的JS+HTML网站,套上跨平台的“马甲”;3、微信小程序及公众号(其实和第2点一样,套了微信的壳)。其中运用JS+HTML的应用占据大部分,这个比例是多少我没有统计和查询相关数据,反正就是很多吧。而JS+HTML移动开发中,大多采用的框架是,前端页面加上WebService。因此,引出我们今天要说的话题:ajax调用handler,使用HttpWebRequest访问WCF服务。说了这么多,其实就是想表明:现在移动开发很热,大家都采用“JS+HTML+WebService+套娃”这种架构,我分享的这个是给大家在这种架构中开发,提供一个解决方案。还是大白话适合我,不过偶尔也要装装逼,吹吹现在的互联网+时代。

正文

言归正传,移动应用的开发采用 “JS+HTML+WebService+套娃”架构,以下均简称这种架构,前端通过JS(JQuery、React等等)和HTML进行呈现和业务操作,再通过ajax请求后台服务数据,服务端以API形式开发接口(WebService、WCF等等)。.net平台中,服务端采用WCF提供API接口,是不错的选择。出于安全考虑,服务端一般不直接开放给客户端直接调用,客户需通过web服务器,中转调用webservice。中转的程序只写一次就可以了,我这里采用了一般处理程序handler。

首先,客户端通过ajax调用handler:

  1. function Commit1() {
  2. var req = {};
  3. req.Name = "测试1";
  4. req.Age = "30";
  5. var dvalue = JSON.stringify(req);
  6. var para = { action: "GetPersonDetail", data: dvalue };
  7. ajaxWCFService(para, false, CommitSuc);
  8. }
  9.  
  10. function CommitSuc(data) {
  11. data = $.parseJSON(data);
  12. alert("Name:" + data.Name + ",Age:" + data.Age);
  13. }
  14.  
  15. //调用服务接口
  16. function ajaxWCFService(param, async, sucFunc) {
  17. var hUrl = document.URL;
  18. var pathName = document.location.pathname;
  19. var pos = hUrl.indexOf(pathName);
  20. var url = hUrl.substring(0, pos);
  21. url += "/handle/BaseHandler.ashx";
  22.  
  23. $.ajax({
  24. type: "post",
  25. url: url,
  26. data: param,
  27. async: async,
  28. success: sucFunc
  29. });
  30. }

Handler做为中转,只开放给网站服务端,对客户端不开放,通过HttpWebRequest访问服务端,我这里采用了WCF:

  1. public void ProcessRequest(HttpContext context)
  2. {
  3. string action = context.Request["action"];
  4. string Data = context.Request["data"];
  5. //Data = "Name=testc&Age=30";
  6. string url = "http://localhost:28380/Service1.svc/" + action;
  7.  
  8. //获取服务端返回信息
  9. string result = postSend(url, Data);
  10. context.Response.Write(result);
  11. }
  12.  
  13. public string postSend(string url, string param)
  14. {
  15. Encoding myEncode = Encoding.GetEncoding("UTF-8");
  16. byte[] postBytes = Encoding.UTF8.GetBytes(param);
  17.  
  18. HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
  19. req.Method = "POST";
  20. req.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";
  21. req.ContentLength = postBytes.Length;
  22. try
  23. {
  24. using (Stream reqStream = req.GetRequestStream())
  25. {
  26. reqStream.Write(postBytes, 0, postBytes.Length);
  27. }
  28.  
  29. using (WebResponse res = req.GetResponse())
  30. {
  31. using (StreamReader reader = new StreamReader(res.GetResponseStream()))
  32. {
  33. string result = reader.ReadToEnd();
  34. return result;
  35. }
  36. }
  37. }
  38. catch (WebException ex)
  39. {
  40. HttpWebResponse res = (HttpWebResponse)ex.Response;
  41. StreamReader reader = new StreamReader(res.GetResponseStream());
  42. string result = reader.ReadToEnd();
  43. string IsSucceed = "false";
  44. string ErrorMsg = "Hander:" + ex.Message + " StackTrace:" + ex.StackTrace+"\r\n ErrorResponse:" + result;
  45. var success = new { IsSucceed, ErrorMsg };
  46. return JSONHelper.ToJSON(success);
  47. }
  48. }

接着,WCF服务端首先是契约定义:

  1. [OperationContract]
  2. [WebInvoke(UriTemplate = "GetPersonDetail", Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
  3. Stream GetPersonDetail(Stream req);

WCF方法的实现:

  1. public Stream GetPersonDetail(Stream stream)
  2. {
  3. StreamReader sr = new StreamReader(stream);
  4. string s = sr.ReadToEnd();
  5. sr.Dispose();
  6. JObject jo = JObject.Parse(s);
  7. string Name = jo["Name"].ToString();
  8. string Age = jo["Age"].ToString();
  9.  
  10. var result = new Person()
  11. {
  12. IsSucceed = true,
  13. Name = "Service Back:" + Name,
  14. Age = "Service Back:" + Age
  15. };
  16. return new MemoryStream(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(result)));
  17. }

至此,“JS+HTML+WebService+套娃”框架基本完成,后面就是添砖加瓦的工作的,只需要写JS页面操作及WCF数据访问即可。

好了今天就写到这,如果这篇文章对你有所帮助,请推荐一下!欢迎转截,请注明出处!

ajax调用handler,使用HttpWebRequest访问WCF服务的更多相关文章

  1. 客户端使用自定义代理类访问WCF服务 z

    通常在客户端访问WCF服务时,都需要添加服务引用,然后在客户端app.config或 web.config文件中产生WCF服务的客户端配置信息.若是每添加一个服务都是这样做,这样势必会将比较麻烦,能否 ...

  2. 客户端使用自定义代理类访问WCF服务

    通常在客户端访问WCF服务时,都需要添加服务引用,然后在客户端app.config或web.config文件中产生WCF服务的客户端配置信息.若是每添加一个服务都是这样做,这样势必会将比较麻烦,能否简 ...

  3. Android访问WCF服务(使用json实现参数传递)

    经过多日努力, 终于勉强弄明白了Android访问WCF服务的方法. 服务端实现 一, 实现服务. 操作契约 [ServiceContract] public interface IService { ...

  4. Ajax跨域访问wcf服务中所遇到的问题总结。

    工具说明:vs2012,sql server 2008R2 1.首先,通过vs2012建立一个wcf服务项目,建立好之后.再新开一个vs2012 建立web项目,通过jQuery的ajax方法访问服务 ...

  5. Wince 中访问WCF服务

    由于本文并非WinCE开发普及篇,所以一些WinCE开发和WCF开发的基础还请移步百度和谷歌寻找答案,然后结合本文开发出WinCE中如何访问WCF,谢谢. 开发环境 IDE:Visual Studio ...

  6. Android访问WCF服务

    原文链接:http://www.cnblogs.com/VinC/archive/2011/02/24/1964049.html 本章目的: 用Wcf建立可以上Android可以访问的数据服务, 数据 ...

  7. 快速访问WCF服务--ServiceModel 元数据实用工具 (Svcutil.exe)

    基本定义 ServiceModel 元数据实用工具用于依据元数据文档生成服务模型代码,以及依据服务模型代码生成元数据文档. SvcUtil.exe ServiceModel 元数据实用工具可在 Win ...

  8. 三种客户端访问wcf服务端的方法 C#

    原文 http://blog.csdn.net/zlj002/article/details/7914556 string jsonstr = String.Empty; string url = & ...

  9. 解决android调用IIS Express中的WCF服务时,出现错误400问题

    IIS Express仅支持localhost主机名地址访问. 找到IIS Express Config文件下的 applicationhost.confi   修改配置 再来调试android应用, ...

随机推荐

  1. 通过Git Gui Here上传本地项目到GitHub上

    要使用此种方法上传本地项目到GitHub上,前提得是你已安装Git for window工具. Git for window下载地址:http://www.xp510.com/xiazai/Appli ...

  2. phpstorm(或webstorm) 打开后 一直停留在scanning files to index....,或跳出内存不够的提示框

    记得3月份做项目时就遇到过这个问题,当时解决的 ,但是忘记怎么解决的啦,所以 ,写博文是多么的重要啊. 说明: 在npm install 后,会出现Scanning files to index .. ...

  3. LAMP与LNMP架构的区别及其具体的选择说明

    LAMP==Linux+Apache+Mysql+PHP LNMP==Linux+Nginx+Mysql+PHP 以上两只架构是目前网站的主流架构 LAMP和LNMP最主要的区别在于: 一个使用的是A ...

  4. UE4/Unity3D中同时捕获多高清摄像头的高效插件

    本文主要讲实现过程的一些坑. 先说下要实现的目标,主要功能在UE4/Unity中都要用,能同时捕获多个摄像头,并且捕获的图片要达到1080p25桢上,并且需要经过复杂的图片处理后丢给UE4/Unity ...

  5. Docker问题: Layer already being pulled by another client. Waiting.什么原因

    问题描述:Layer already being pulled by another client. Waiting. 问题分析:这是 1.8版本的一个bug,会在1.9版本中修复.http://st ...

  6. CCF系列之Z字形扫描(201412-2)

    试题编号:201412-2试题名称:Z字形扫描时间限制: 2.0s内存限制: 256.0MB 问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan).给定一个n ...

  7. 一个简单的div弹出层的小例子

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  8. C# 将Access中时间段条件查询的数据添加到ListView中

    C# 将Access中时间段条件查询的数据添加到ListView中 一.让ListView控件显示表头的方法 在窗体中添加ListView 空间,其属性中设置:View属性设置为:Detail,Col ...

  9. 我看过得最易懂的一段AOP的解释

    http://blog.csdn.net/zhangliangzi/article/details/51648032 面向切面编程(AOP是Aspect Oriented Program的首字母缩写) ...

  10. linux常用命令_1

    linux中命令格式是什么? 命令 [参数选项] [文件或路径] 中括号表示可选,命令的参数与路径文件可选 参数选择表示一个命令的不同功能 命令 和 参数选项 中必有一空格,多个参数连在一起写 几乎所 ...