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 onkeypress与onkeydown 事件区别详细说明
Dec 13 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
Oct 17 Javascript
javascript制作游戏开发碰撞检测的封装代码
Mar 31 Javascript
AngularJS读取JSON及XML文件的方法示例
May 25 Javascript
react高阶组件经典应用之权限控制详解
Sep 07 Javascript
JS获取字符对应的ASCII码实例
Sep 10 Javascript
Vue完整项目构建(进阶篇)
Feb 10 Javascript
vue.js中created方法作用
Mar 30 Javascript
vue.js使用v-model指令实现的数据双向绑定功能示例
May 22 Javascript
35个最好用的Vue开源库(史上最全)
Jan 03 Javascript
vue双向绑定及观察者模式详解
Mar 19 Javascript
vue自定义js图片碎片轮播图切换效果的实现代码
Apr 28 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
从C/C++迁移到PHP——判断字符类型的函数
2006/10/09 PHP
php foreach 使用&amp;(与运算符)引用赋值要注意的问题
2010/02/16 PHP
php中实现精确设置session过期时间的方法
2014/07/17 PHP
php生出随机字符串
2017/07/06 PHP
js 动态添加标签(新增一行,其实很简单,就是几个函数的应用)
2009/03/26 Javascript
js 获取服务器控件值的代码
2010/03/05 Javascript
原生js实现跨浏览器获取鼠标按键的值
2013/04/08 Javascript
form.submit()不能提交表单的原因分析
2014/10/23 Javascript
js实现基于正则表达式的轻量提示插件
2015/08/29 Javascript
JS留言功能的简单实现案例(推荐)
2016/06/23 Javascript
JavaScript如何实现跨域请求
2016/08/05 Javascript
Bootstrap 轮播(Carousel)插件
2016/12/26 Javascript
浅谈vue实现数据监听的函数 Object.defineProperty
2017/06/08 Javascript
Node.js之readline模块的使用详解
2019/03/25 Javascript
前端路由&amp;webpack基础配置详解
2019/06/10 Javascript
js设计模式之单例模式原理与用法详解
2019/08/15 Javascript
小程序组件传值和引入sass的方法(使用vant Weapp组件库)
2020/11/24 Javascript
Vue+element-ui添加自定义右键菜单的方法示例
2020/12/08 Vue.js
Python设计实现的计算器功能完整实例
2017/08/18 Python
Python字典及字典基本操作方法详解
2018/01/30 Python
python爬虫之模拟登陆csdn的实例代码
2018/05/18 Python
pytorch + visdom CNN处理自建图片数据集的方法
2018/06/04 Python
python用pandas数据加载、存储与文件格式的实例
2018/12/07 Python
python自动化之Ansible的安装教程
2019/06/13 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
2019/09/05 Python
利用django model save方法对未更改的字段依然进行了保存
2020/03/28 Python
HTML5中视频音频的使用详解
2017/07/07 HTML / CSS
详解HTML5 Canvas标签及基本使用
2020/01/10 HTML / CSS
Dower & Hall官网:英国小众轻奢珠宝品牌
2019/01/31 全球购物
Erwin Müller穆勒家居瑞士官网:您整个家庭的邮购公司
2019/12/28 全球购物
人事部经理岗位职责
2014/03/07 职场文书
2014年煤矿安全工作总结
2014/12/04 职场文书
民事二审代理词
2015/05/25 职场文书
律师函格式范本
2015/05/27 职场文书
MyBatis自定义SQL拦截器示例详解
2021/10/24 Java/Android
Golang 对es的操作实例
2022/04/20 Golang