ajax调用handler,使用HttpWebRequest访问WCF服务
引言
随着手机及移动设备的普及,移动端的应用也进入了热潮。以前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:
function Commit1() { var req = {}; req.Name = "测试1" ; req.Age = "30" ; var dvalue = JSON.stringify(req); var para = { action: "GetPersonDetail" , data: dvalue }; ajaxWCFService(para, false , CommitSuc); } function CommitSuc(data) { data = $.parseJSON(data); alert( "Name:" + data.Name + ",Age:" + data.Age); } //调用服务接口 function ajaxWCFService(param, async, sucFunc) { var hUrl = document.URL; var pathName = document.location.pathname; var pos = hUrl.indexOf(pathName); var url = hUrl.substring(0, pos); url += "/handle/BaseHandler.ashx" ; $.ajax({ type: "post" , url: url, data: param, async: async, success: sucFunc }); } |
Handler做为中转,只开放给网站服务端,对客户端不开放,通过HttpWebRequest访问服务端,我这里采用了WCF:
public void ProcessRequest(HttpContext context) { string action = context.Request[ "action" ]; string Data = context.Request[ "data" ]; //Data = "Name=testc&Age=30"; string url = "http://localhost:28380/Service1.svc/" + action; //获取服务端返回信息 string result = postSend(url, Data); context.Response.Write(result); } public string postSend( string url, string param) { Encoding myEncode = Encoding.GetEncoding( "UTF-8" ); byte [] postBytes = Encoding.UTF8.GetBytes(param); HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url); req.Method = "POST" ; req.ContentType = "application/x-www-form-urlencoded;charset=UTF-8" ; req.ContentLength = postBytes.Length; try { using (Stream reqStream = req.GetRequestStream()) { reqStream.Write(postBytes, 0, postBytes.Length); } using (WebResponse res = req.GetResponse()) { using (StreamReader reader = new StreamReader(res.GetResponseStream())) { string result = reader.ReadToEnd(); return result; } } } catch (WebException ex) { HttpWebResponse res = (HttpWebResponse)ex.Response; StreamReader reader = new StreamReader(res.GetResponseStream()); string result = reader.ReadToEnd(); string IsSucceed = "false" ; string ErrorMsg = "Hander:" + ex.Message + " StackTrace:" + ex.StackTrace+ "\r\n ErrorResponse:" + result; var success = new { IsSucceed, ErrorMsg }; return JSONHelper.ToJSON(success); } } |
接着,WCF服务端首先是契约定义:
[OperationContract] [WebInvoke(UriTemplate = "GetPersonDetail" , Method = "POST" , BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)] Stream GetPersonDetail(Stream req); |
WCF方法的实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public Stream GetPersonDetail(Stream stream) { StreamReader sr = new StreamReader(stream); string s = sr.ReadToEnd(); sr.Dispose(); JObject jo = JObject.Parse(s); string Name = jo[ "Name" ].ToString(); string Age = jo[ "Age" ].ToString(); var result = new Person() { IsSucceed = true , Name = "Service Back:" + Name, Age = "Service Back:" + Age }; return new MemoryStream(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(result))); } |
至此,“JS+HTML+WebService+套娃”框架基本完成,后面就是添砖加瓦的工作的,只需要写JS页面操作及WCF数据访问即可。
好了今天就写到这,如果这篇文章对你有所帮助,请推荐一下!欢迎转截,请注明出处!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南