jQuery ajax调用WCF服务实例


Posted in Javascript onJuly 16, 2014

恩,在由瘦客户端转换成胖浏览器端的“潮流”下,必然要使用JavaScript调用后台的各种服务。

?潘克??さ牟?吠ㄐ哦际鞘褂玫?CF服务,因此必然要学习这样的内容。借用jQuery强大的库,使用JavaScript访问WCF服务非常简便。同事研究了一个breeze库,那么?潘烤屠词匝橐幌?jax。这里把实现简单地记录以便马克一下,以后忘了就看这篇日志来作弊。

一、更改WCF服务的配置

默认情况下,WCF服务是不允许使用HTTP请求来访问的。我们需要将WCF服务的配置文件(注意如果有其他启动WCF服务的项目应该修改该项目的app.config文件)修改,将serviceHostEnvironment节添加aspNetCompatibilityEnabled属性并设为true:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true">

  <serviceActivations>

    <add relativeAddress="TableManager.svc" service="TableManagerIntegrationTestService.TestResultService" 

         factory="System.ServiceModel.Activation.WebScriptServiceHostFactory"/>

  </serviceActivations>

</serviceHostingEnvironment>

而且,与之相关的服务binding属性要配置成webHttpBinding,这样js才能进行调用:

      <service name="TableManagerIntegrationTestService.TestResultService">

        <endpoint address="" binding="webHttpBinding" contract="TableManagerIntegrationTestService.ITestResultService" behaviorConfiguration="EndpBehavior">

          <identity>

            <dns value="localhost" />

          </identity>

        </endpoint>

......

二、WCF服务的操作契约

S要调用的服务操作契约必须为WebGet或WebInvoke。标记为WebGet属性的可以使用HTTP GET方法调用,而WebInvoke标记允许HTTP POST方法调用。

我这里有一个简单的例子,该WCF服务接收年月日作为参数,返回该天的日志记录。

该服务的Service Contract定义如下:

[ServiceContract]

public interface ITestResultService

{

    [OperationContract]

    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]

    List<TestResultData> GetData(int year, int month, int date);
}

GetData方法的标记定义了该方法允许HTTP POST方法调用,返回的数据是JSON格式。指定了数据的返回格式后,我们不需要编写任何代码,WCF会将一个可序列化的对象自动转换成对应的格式。

在服务类中,还需要指定AspNetComatibilityRequirements标记,如下面的示例代码所示:

    [AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)]

    public class TestResultService : ITestResultService

    {
        public List<TestResultData> GetData(int year, int month, int date)

        {

            try

            {

                DateTime start_time = new DateTime(year, month, date, 0, 0, 0);

                DateTime end_time = new DateTime(year, month, date, 23, 59, 59);
                DataSet ds = LogDataAccess.SelectDailyBuildLog(start_time, end_time);
                var test_result_list = new List<TestResultData>();
                foreach (DataRow result in ds.Tables[0].Rows)

                {

                    TestResultData result_data = new TestResultData

                    {

                        DeployDate = Convert.ToDateTime(result["StatTime"]).ToString(),

                        ServerName = result["ComponentName"].ToString(),

                        Build = result["Build"].ToString(),

                        Result = result["Result"].ToString(),

                        ServerInformation = result["Versions"].ToString()

                    };
                    test_result_list.Add(result_data);

                }
                return test_result_list;

            }

            catch (Exception ex)

            {

                throw ex;

            }

        }
    }

}

三、浏览器请求WCF服务

基本上,$.ajax方法需要8个参数:type指定操作方法(如POST)、url指定WCF服务的地址、data是传给WCF的数据(也就是参数)、contentType指定data的格式(如json)和文字编码、dataType指定返回数据的格式、processData指示是否自动将数据处理成application/x-www-form-urlencoded格式、success和error属性指示操作成功或失败后的回调方法。

我们在脚本中定义如下全局变量,以便调用ajax时访问:

var Type, Url, Data, ContentType, DataType, ProcessData;

我们编写一个CallService方法,该方法直接调用$.ajax方法,并使用上面定义的参数:

function CallService() {

    $.ajax({

        type: Type,

        url: Url,

        data: Data,

        contentType: ContentType,

        dataType: DataType,

        processData: ProcessData,

        success: function (msg) {

            ServiceSucceded(msg);

        },

        error: ServiceFailed

    });

}

以下是调用服务的一个示例,该方法从Year、Month和Date文本框中获取用户输入的数据,并调用WCF服务请求数据:

function WcfJson() {

    Type = "POST";

    Url = "http://localhost:8734/TableManagerIntegrationTestService/TestResultService/GetData";

    Data = '{"year":' + $("#Year").val() + ', "month":' + $("#Month").val() + ', "date":' + $("#Date").val() + '}';

    ContentType = "application/json; charset=utf-8";

    DataType = "json"; varProcessData = true;
    CallService();

}

在数据请求成功后,会调用success参数指定的回调方法,在此我们就可以处理返回结果。

返回结果是一个json格式的数据,如我们的例子中返回的是一个结果列表。如果不确定它的结构,可以在这里加个断点看看:
jQuery ajax调用WCF服务实例可以看到结果就在result对象的GetDataResult属性中。直接访问这个属性的各元素就能得到结果了:

function ServiceSucceded(result) {

    if (DataType == "json") {

        mainView.clearItem();
        for (var i = 0; i < result.GetDataResult.length; i++) {

            var resultObject = result.GetDataResult[i];
            resultCollection.add(resultObject.ServerName, resultObject.DeployDate, resultObject.Build, resultObject.Result, resultObject.ServerInformation);

        }
        mainView.render(document.getElementById("logContainer"));

    }

}

resultCollection和mainView是我自定义的两个类,用于存储要显示的数据和绘制表格。代码在这里就不写了。

现在,启动WCF的服务,然后跑我们编写的页面,结果就出来了:
jQuery ajax调用WCF服务实例界面很丑敬请见谅  ^_^。(稍微调下CSS就会好看很多了……)

Javascript 相关文章推荐
js压缩工具 yuicompressor 使用教程
Mar 31 Javascript
深入理解JavaScript系列(8) S.O.L.I.D五大原则之里氏替换原则LSP
Jan 15 Javascript
jQuery中验证表单提交方式及序列化表单内容的实现
Jan 06 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
May 11 Javascript
jQuery+css实现的蓝色水平二级导航菜单效果代码
Sep 11 Javascript
AngularJS 日期格式化详解
Dec 23 Javascript
javascript时间排序算法实现活动秒杀倒计时效果
Jan 28 Javascript
JS获取checkbox的个数简单实例
Aug 19 Javascript
Angular.js实现注册系统的实例详解
Dec 18 Javascript
JavaScript数据类型和变量_动力节点Java学院整理
Jun 26 Javascript
如何基于vue-cli3.0构建功能完善的移动端架子
Apr 24 Javascript
vue路由守卫,限制前端页面访问权限的例子
Nov 11 Javascript
Jquery Post处理后不进入回调的原因及解决方法
Jul 15 #Javascript
js限制checkbox选中个数以限制六个为例
Jul 15 #Javascript
js用typeof方法判断undefined类型
Jul 15 #Javascript
js的image onload事件使用遇到的问题
Jul 15 #Javascript
js操作IE浏览器弹出浏览文件夹可以返回目录路径
Jul 14 #Javascript
js拼接html注意问题示例探讨
Jul 14 #Javascript
JQuery中使用ajax传输超大数据的解决方法
Jul 14 #Javascript
You might like
PHP+MySQL 制作简单的留言本
2009/11/02 PHP
同台服务器使用缓存APC效率高于Memcached的演示代码
2010/02/16 PHP
PHP执行linux系统命令的常用函数使用说明
2010/04/27 PHP
PHP将整个网站生成HTML纯静态网页的方法总结
2012/02/05 PHP
php微信开发之图片回复功能
2018/06/14 PHP
html中的input标签的checked属性jquery判断代码
2012/09/19 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(一)让静态人物动起来
2013/01/23 Javascript
跟我学习javascript的隐式强制转换
2015/11/16 Javascript
JavaScript操作class和style样式代码详解
2016/02/13 Javascript
第一次接触神奇的Bootstrap网格系统
2016/07/27 Javascript
jQuery html表格排序插件tablesorter使用方法详解
2017/02/10 Javascript
jQuery中on方法使用注意事项详解
2017/02/15 Javascript
JavaScript实现省市县三级级联特效
2017/05/16 Javascript
vue如何集成raphael.js中国地图的方法示例
2017/08/15 Javascript
Javascript迭代、递推、穷举、递归常用算法实例讲解
2019/02/01 Javascript
Node.js Windows Binary二进制文件安装方法
2019/05/16 Javascript
微信小程序如何修改radio和checkbox的默认样式和图标
2019/07/24 Javascript
微信小程序的授权实现过程解析
2019/08/02 Javascript
vue基于v-charts封装双向条形图的实现代码
2019/12/09 Javascript
rhythmbox中文名乱码问题解决方法
2008/09/06 Python
整理Python 常用string函数(收藏)
2016/05/30 Python
实例讲解python中的协程
2018/10/08 Python
解决python3 pika之连接断开的问题
2018/12/18 Python
Python opencv实现人眼/人脸识别以及实时打码处理
2019/04/29 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
2020/03/06 Python
tensorflow之读取jpg图像长和宽实例
2020/06/18 Python
记一次高分屏下canvas模糊问题
2020/02/17 HTML / CSS
阿联酋网上花店:Ferns N Petals
2018/02/14 全球购物
捷克建筑材料网上商店:DEK.cz
2021/03/06 全球购物
研究生毕业自我鉴定范文
2014/03/27 职场文书
副主任竞聘演讲稿
2014/08/18 职场文书
文化苦旅读书笔记
2015/06/29 职场文书
关于nginx 实现jira反向代理的问题
2021/09/25 Servers
python 管理系统实现mysql交互的示例代码
2021/12/06 Python
《遗弃》开发商删推文要跑路?官方回应:还在开发
2022/04/03 其他游戏
SpringBoot接入钉钉自定义机器人预警通知
2022/07/15 Java/Android