Jquery Ajax 跨域调用asmx类型 WebService范例

摘要:Ajax
在 Web 2.0 时代起着非常重要的作用,然而有时因为同源策略(SOP)(俗称:跨域问题(cross domain)) 它的作用会受到限制。在本文中,将学习如何克服合作限制。本文以asmx方式搭建webservice作为测试用后端,给出完整的前后端调用解决方案、范例代码。

关键词: jquery ajax 跨域  webservice  asmx  cross-domain

0 问题分析

0.1 什么是跨域问题?

越来越多的网站需要相互协作。例如,在线房屋租赁网站需要谷歌地图的支持,以显示特定租赁房屋的位置。为了满足这样的需求,已经出现了各种各样的
mashup。mashup 是一种将不同供应商的数据或组件集成起来,使之更加有用或更用户化的Web
应用程序。Mashup(或协作功能)被认为是Web 2.0
的重要组成部分。

出人意料的是,将异步的 JavaScript、XML (Ajax)和
mashup结合起来并不容易。由于浏览器施加的安全限制,让页面上的不同小部件彼此之间相互通信比较麻烦。通常,您可以通过在服务器端设置一个代理来解决此问题,该方法是不可扩展的。

问题详情见图:

                 
      

0.2 问题解决思路

0.2.1 JSONP

JSONP 利用了 Web 页面可以从任何源码中下载脚本的能力。但 JSONP 有两个主要的限制:它与 Ajax 调用一样没有错误处理机制,并且脚本标记请求要使用 Get method,其中对长度有所限制。此方法非本文讨论重点,更多详情请自行搜索。

0.2.2 代理方法

思路请见图

本文使用vs2013作为集成开发环境(后简称IDE),理论上不受IDE限制。下文为测试项目,证明代理方案的可行性。

1 使用asmx建立asp.net webservice后端

1.1新建项目

VS2013->new project->Web Visual Studio2012->Asp.net Empty Web Application,取名“CrossDomain.Backend”,路径随意。

1.2 新建asmx

右击“CrossDomain.Backend”项目->新增->新项目->web->asmx->新增按钮

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Web;
using System.Web.Script.Services;
using System.Web.Services;

namespace CrossDomain.Backend
{
    /// <summary>
    /// Summary description for WebService1
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
    [System.Web.Script.Services.ScriptService]
    public class WebService1 : System.Web.Services.WebService
    {
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public int Sum(int a,int b)
        {
            Thread.Sleep(3000);
            return a+b;
        }
    }
}

1.3 小结。

后端建立完毕,可以自行调试。

2 建立前端

2.1 新建项目

VS2013->new project->Web Visual Studio2012->Asp.net Empty Web Application,取名“CrossDomain.Frontend”,路径随意。

2.2 建立文件架构

架构如下图

2.3 index.html代码如下:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>ajaxCallAsmxSample</title>
    <script src="js/jquery-2.2.3.min.js" type="text/javascript"></script>
    <script src="js/jquery.blockUI.js" type="text/javascript"></script>
    <script src="js/index.js" type="text/javascript"></script>

</head>

<body>
    a:<input type="text" id="a"><br>
    b:<input type="text" id="b"><br>
    <button id="ButtonAjaxRequest">AjaxRequest</button><br>
    <label id="result"></label>

</body>

</html>

2.4 index.js代码如下

"use strict";

$(document).ready(function () {
    $("#ButtonAjaxRequest").click(AjaxCallAsmx);
});

var dtStart;
var dtEnd;
var administrativeLevelStr;
var areaName;

var backEndUrl = "http://localhost:5633/WebService1.asmx/Sum";
var proxyUrl = "http://localhost:5726/DotNet/proxy.ashx?";

function AjaxCallAsmx() {
    //显示遮罩并阻塞用户交互
    $.blockUI({ message: '<h1><img src="images/loading.gif" .> Just a moment...</h1>' });

    $.ajax({
        type: "POST",
        url: proxyUrl+backEndUrl,
        data: {
            a: $("#a").val(),
            b: $("#b").val()
        },
        dataType: "xml", //asmx默认返回xml格式数据
        success: function (data, statusText, jqXHR) {
            var x = $.parseXML(jqXHR.responseText);
                    var c = x.childNodes[0].textContent;
            $("#result").html(c);
            //去除遮罩
            $.unblockUI();
        }
    });
}

请注意:

1 如果此处不使用代理(proxy),将出现常见的“跨域错误”,此处对错误案例不做列举,相信查阅到此文的读者都遇到过类似问题。

2 主要起到代理作用的是DotNet/proxy.ashx文件。此文件最新版详见github,下载地址:https://github.com/Esri/resource-proxy。作者提供了:dotnet/java/php三种主流版本。

3 总结

文本对跨域问题的原因、分析、解决思路、思路实践案例进行了整理。留以方便读者少走弯路,同时自己备查。

4 参考文献

Wang Jiaye, Hu Changchun;利用客户端解决方案改进跨域通信; https://www.ibm.com/developerworks/cn/web/wa-crossdomaincomm/

JavaScript: Use a Web Proxy for Cross-Domain XMLHttpRequest Calls; https://developer.yahoo.com/javascript/howto-proxy.html

本范例代码下载地址:http://download.csdn.net/detail/fanrong1985/9513581

时间: 2024-12-15 18:29:34

Jquery Ajax 跨域调用asmx类型 WebService范例的相关文章

jquery ajax跨域请求webservice webconfig配置

jquery ajax跨域请求webservice web.config配置 <configuration> <system.web> <compilation debug="true" targetFramework="4.0" /> <webServices> <protocols> <add name="HttpGet"/> <add name="Htt

自己的项目结合MVC实现ajax跨域调用

好久没写东西了,自我检讨一下,写不完这篇不下班!! 最近在做一个项目模块通用的分享功能插件,由于各个模块调用所以会出现跨域问题,正好之前同事解决过,于是自己亲身实践把这次解决问题的经历记录下来.闲言少叙,书归正传~ 首先,项目背景,一个基于jquery的分享插件开发,自己也是尝试着写这么个东西,第一次写,质量肯定差,下次博文把这次开发经历写出来.由于这次解决ajax跨域的方法很简单,我就粘贴代码简单说明一下. 第一步:编写后台程序,MVC下代码如下:      //这是一个获取某个用户的通讯录分

以短链服务为例,探讨免AppKey、免认证、Ajax跨域调用新浪微博API

新浪微博的API官方提供了很多种调用方式,支持编程的,归根结底就是两种: 1.基于Oauth协议,使用Open API.(http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E) 2.使用Weibo JS-SDK(http://open.weibo.com/sdk/js ). 官方的方式总是显得很麻烦.我们来探讨一下,能不能通过非官方的方法,免AppKey.免认证.Ajax跨域调用新浪微博

AJAX跨域调用相关知识-CORS和JSONP(引)

AJAX跨域调用相关知识-CORS和JSONP 1.什么是跨域 跨域问题产生的原因,是由于浏览器的安全机制,JS只能访问与所在页面同一个域(相同协议.域名.端口)的内容. 但是我们项目开发过程中,经常会遇到在一个页面的JS代码中,需要通过AJAX去访问另一个服务器并返回数据,这时候就会受到浏览器跨域的安全限制了. 这里要注意,如果只是通过AJAX向另一个服务器发送请求而不要求数据返回,是不受跨域限制的.浏览器只是限制不能访问另一个域的数据,即不能访问返回的数据,并不限制发送请求. 我们接下来就为

调用ajax 跨域调用接口

//ajax 跨域请求数据 function ajaxType (){ $.ajax({ url: "http://127.0.0.1:9090/spring_mvc/HttpClient/ajaxType.do?jsonpCallback=?", type: "GET", data: { pwd: encodeURI('周'), username: 'tl' }, dataType: "jsonp", success: function(dat

NodeJ node.js Jquery Ajax 跨域请求

Jquery + Ajax 跨域请求 说白了就是前台请求ajax数据(JSON)但是请求的数据不在本地的绝对路径下,接口数据 是没有这个安全性的我对外公开的接口数据,只要你找到接口你就可以使用里面的数据 ,但是在浏览器端他做了一套机制就是 不让你随意的访问别人服务器的外来接口,如果是好的数据的化  你可以学习使用,如果是一些恶意数据,对服务器对个人来说都是没有安全性的,目前明白一点就是 阻止跨域请求就是 浏览器的原因,也算是ajax的原因,所以这个前台你是无能为力的. 解决办法: 服务器端进行权

jquery ajax跨域请求webservice

有种方式可以通过JSONP方式来请求 这里具体介绍如何通过修改配置文件来实体AJAX跨域请求WEBSERVICE WEBSERVICE的类声名 /// <summary> /// MobileService 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)

jquery ajax跨域的完美解决方法(jsonp方式)

ajax跨域请求的问题,JQuery对于Ajax的跨域请求有两类解决方案,不过都是只支持get方式,接下来为大家详细介绍下客户端JQuery.ajax的调用代码 今天在项目中需要做远程数据加载并渲染页面,直到开发阶段才意识到ajax跨域请求的问题,隐约记得Jquery有提过一个ajax跨域请求的解决方式,于是即刻翻出Jquery的API出来研究,发 JQuery对于Ajax的跨域请求有两类解决方案,不过都是只支持get方式.分别是JQuery的 jquery.ajax jsonp格式和jquer

Jquery的跨域调用

JQuery1.2后getJSON方法支持跨域读取json数据,原理是利用一个叫做jsonp的概念.当然,究其本质还是通过script标签动态加载js,似乎这是实现真正跨域的唯一方法. getJSON的用法JQuery手册已经写得很详细,参考手册就可以了,很简单.需要指出的一点是getJSON利用的jsonp需要客户端与服务端作出配合. 客户端传递的URL里要包含callback变量,以形如callback=?的形式结尾.(jquery会随机生成一个字符串替换?传递给服务端) 服务端获取客户端传