zoukankan      html  css  js  c++  java
  • 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+"
     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方法的实现:

            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数据访问即可。

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

  • 相关阅读:
    简单的MVC小应用
    jsp四大指令元素,三大脚本元素,八大动作元素
    servlet session管理的四种方式 --隐藏表单
    servlet session管理的四种方式--一 url重写
    创建servlet三种方式(韩顺平老师课程)
    python函数
    tcpprobe ——监听TCP信息的内核模块
    Popen的方法
    Python中执行系统命令常见的几种方法
    > /dev/null 2>&1 含义
  • 原文地址:https://www.cnblogs.com/lisweden/p/8421221.html
Copyright © 2011-2022 走看看