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

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

大家好,又见面了,我是你们的朋友全栈君。

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

 

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

 

0 问题分析

0.1 什么是跨域问题?

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

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

问题详情见图:

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

0.2 问题解决思路

0.2.1 JSONP

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

0.2.2 代理方法

思路请见图

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

 

本文使用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 建立文件架构

架构如下图

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

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 = "/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();
        }
    });
}

请注意:

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

2 主要起到代理作用的是DotNet/proxy.ashx,和proxy.config文件;建议将这两个文件放在同一文件夹下。此文件最新版详见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

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136314.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Mac用QuickTime录屏+soundflower录制屏内外声音

    Mac用QuickTime录屏+soundflower录制屏内外声音mac自带的quickTime录屏没有声音,可以安装soundflower录制屏内外声音。安装好soundflower后,开始配置。启动台搜索MIDI音频设置,左下角+号聚集设备之后是+多输出设备之后是系统偏好设置选声音,输入选聚集设备之后是输出,选多输出设备之后配置quicktime:右键,新建屏幕录制,选项,聚集设备,之后OK了,开始录制吧。录完后需要声音:输入和输出改回内置麦克风和内置扬声器,不然声音大小不能修改了。…

    2022年6月3日
    60
  • epoll使用具体解释(精髓)

    epoll使用具体解释(精髓)

    2021年11月16日
    67
  • Java:JavaSocket编程开发多人聊天室「建议收藏」

    Java:JavaSocket编程开发多人聊天室「建议收藏」Java|JavaSocket编程开发多人聊天室实现内容运行结果部分代码完整代码实现内容用Java图形用户界面编写聊天室服务器端和客户端,支持多个客户端连接到一个服务器。每个客户端能够输入账号。可以实现群聊(聊天记录显示在所有客户端界面)。完成好友列表在各个客户端上显示。可以实现私人聊天,用户可以选择某个其他用户,单独发送信息。服务器能够群发系统消息,能够强行让某些用户下线。客户端的上线下线要求能够在其他客户端上面实时刷新。运行结果部分代码importjava.awt

    2022年6月17日
    39
  • 如何画UML类图

    如何画UML类图简单介绍统一建模语言 UnifiedModel UML 是用来设计软件蓝图的可视化建模语言 面向对象的建模语言的国际标准 它的特点是简单 统一 图形化 能表达软件设计中的动态与静态信息 类 接口 类图类类 Class 是指具有相同属性 方法和关系的对象的抽象 它封装了数据和行为 是面向对象程序设计 OOP 的基础 具有封装性 继承性和多态性等三大特性 在 UML 中 类使用包含类名 属性和操作且带有分隔线的矩形来表示 类名类名 Name 是一个字符串 例如

    2025年12月12日
    3
  • (转载)详细设计-盒图 PAD图 过程设计语言

    (转载)详细设计-盒图 PAD图 过程设计语言(转载)详细设计-盒图PAD图过程设计语言1、详细设计的任务(主要工作)有哪些?详细设计的工作:确定应该怎样具体地实现所有要求的系统,也就是说经过这个阶段的设计工作,应该得出目标系统的精确描述。设计得到的结果是确定每个模块内部的算法和数据结构,产生描述各模块处理过程的详细文档。2、软件详细设计描述工具的概念和使用:程序流程图、N-S图、PAD图、PDL语言:什么是,基本符号和表…

    2022年8月13日
    9
  • Python全栈工程师(每周总结:2)

    Python全栈工程师(每周总结:2)ParisGabrielParisGabriel感谢大家的支持每天坚持一天一篇点个订阅吧灰常感谢当个死粉也阔以weeksummer:Python人工智能从入门到精通字符串st

    2022年7月5日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号