一:故事背景
    以前在写WebApi2的时候,一直是用作前后端分离(WebApi2 +angularjs),可是最近自己在给WebApp写接口的时候遇到了很多坑,总结一下就是跨域问题。而跨域问题在WebApi2中配置也是有点麻烦,不知道在2中是否有对jsonp跨域问题更好解决方案,如果有,跪求各位博友在分享自己的想法。
    闲话少说,快速进入正题。
二:使用Jsonp跨域
    我们现在的客户端和服务器端都是写在同一个站点上面,那么当我们使用Jsonp进行传输数据的时候,格式应为如下:
    当然这里的api/demo就是我们写的自己路由地址
    可是如果后端什么都不配置,就会出现如下错误:
通过jsonp的后端配置,返回的http转台玛终于从500变成了200
,可是现在的问题就是,他始终不跳进success里面去,在网上找了很多解决方案都是不行,返回的即使是200,它也始终不跳进success里面去,所以,接下来我研究了jsonp的原理
三:jsonp的原理
    3.1 什么是jsonp
    要了解JSONP,不得不提一下JSON,那么什么是JSON ?
    JSON is a subset of the object literal notation of JavaScript. Since JSON is a subset of JavaScript, it can be used in the language with no muss or fuss.
    JSONP(JSON with Padding)是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。
    3.2 jsonp为什么能跨域
    由于同源策略的限制,XmlHttpRequest (ajax 调用)只允许调用当前站点的资源(域名、协议、端口)的资源,而我们知道,link 和script标签中的src是可以指向外网资源的,也就是我们通过这个我们是可以访问 ” 外面资源 “ 的,所以利用这一点,我们可以实现简单的跨域。
    3.3 jsonp 跨域原理说明
    当我们客户端向服务器发送请求的时候,客户端会注册一个回调参数(默认为callback),这个回调参数就是客户端和服务器进行认证的安全策略,服务器端获取到callback的值后,将返回的数据包裹(假如callback的注册值为jQuery21409887892813421786_1451718790536 ,那么返回的值就为:jQuery21409887892813421786_1451718790536({}))起来,然后发送给客户端,客户端首先解析script标签,并执行里面的值,通过注册的回掉参数,把返回的值给取出来,最后传入到客户端预先定义好的callback函数里面去(如果使用ajax jsonp 的话,那就是success了)。注意返回的要是可执行的js代码。如果你使用MVCController写Api的话很简单,只需要返回JavaScriptResult就可以了
    3.4 额外说明
        一旦使用jsonp,那么它和ajax 就不是同一种协议了,可是你可以在ajax中使用jsonp,可能在这一点上有点误导,大家一定要明白清楚。
四:MVC Jsonp服务器端的简单配置
    
在mvc中,你只需要返回JavaScriptResult,它自动会添加Script标签,也不需要配置其它的东西。
五:繁琐的WebApi2 jsonp跨域配置
    5.1 我们要使返回的值为js文档,就需要修改返回值的Formatter,所以我们在这借鉴蒋大哥的示例代码:http://www.cnblogs.com/artech/archive/2013/12/05/3460544.html
    这里是一个
    (代码是截图的,可能效果不是很好,请大家见谅)
在蒋大哥的代码中,它屏蔽掉了所有非HttpGet方式的请求,我在这里扩展了一下,所有类型的Http请求都可以进行访问。
            
   然后我们的jsonp就可以进行跨域了
返回的结果如下
最后大家对格式格式进行转换一下就可以开心的进行跨域了

WebApi2 jsonp跨域问题的更多相关文章

  1. 原生JS封装Ajax插件(同域&&jsonp跨域)

    抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...

  2. 借助node实战JSONP跨域

    一.前言: 浏览器安全是基于同源策略的.所谓同源策略就是三相同: 1.协议相同: 2.域名相同: 3.端口相同. 但,凡事都是有利弊,同源策略也导致了我们想用AJAX跨域请求,但NO!!为了规避这种限 ...

  3. jsonp跨域+ashx(示例)

    前言 做B/S项目的时候,我们一般使用jquery+ashx来实现异步的一些操作,比如后台获取一些数据到前台,但是如果ashx文件不在本项目下,引用的是别的域下的文件,这时候就访问不了.关于jsonp ...

  4. Jsonp跨域访问

    很早之前看过好几篇跨域访问的文章,然后做项目的时候基本没有遇到跨域访问的问题.不过该来的还是会来,前些天终于让我遇到了.于是重温了一下原理这些,再进行实战.于是现在也敢通过实战后的一些理解来和大家分享 ...

  5. jsonp 跨域请求

    背景: JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为"Same-Origin Policy"(同源 ...

  6. 我的jsonp跨域问题

    关于jsonp跨域问题,在这个方面也是了解一点点,先记录下来,主要作为以后查看,之前下载并安装过wampserver,了解到了jsonp和json的区别,现在谈谈跨域这个问题: 首先什么是跨域,简单地 ...

  7. jsonP跨域调用

    -------------------------------------jsonP跨域调用------------------------------------- <div class=&q ...

  8. JSONP跨域的原理解析( 一种脚本注入行为)

    JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制, 被称为“some-Origin Policy”(同源策略).这一策略对于Jav ...

  9. jsonp跨域问题

    JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式). 同源策略限制 ...

随机推荐

  1. MSP430常见问题之FLASH存储类

    Q1:用IAR Embedded Workbench for MSP430 通过JTAG往MSP430上写程序.为了知道片内程序的版本,必须读出Flash 中内容.什么工具软件可以通过JTAG口实现这 ...

  2. poj 2182 树状数组

    这题对于O(n^2)的算法有很多,我这随便贴一个烂的,跑了375ms. #include<iostream> #include<algorithm> using namespa ...

  3. Acrobat 2015 win32破解版

    Acrobat 2015 win32破解版,带破解补丁dll覆盖即可 百度云盘:http://pan.baidu.com/s/1i4tFnNJ

  4. jquery之css()改变字体大小,颜色,背景色

    转: <script type="text/javascript"> $(document).ready(function() {         $("#f ...

  5. RedirectFromLoginPage和FormsAuthenticationTicket的区别

    如果你对.net身份验证不是很清晰,请看本文.本文用简单明了的语言,让你对RedirectFromLoginPage和FormsAuthenticationTicket有一个完整的认识. 1)Form ...

  6. 手机看youtube的方法|一个好用的VPN

    俗话说:网络无国界.但是由于天朝的限制,我们无法访问YouTube .谷歌.twitter等一些国外网站. 这个时候我们就需要FQ.最直接有效的方法就是:VPN(虚拟专用网络). 虚拟专用网络的功能是 ...

  7. UVaLive6834 Shopping

    题意:一条直线上有n个点,标号从1到n,起点为0,终点为N+1,给定m个限制关系(ci,di),访问ci点前必须先访问di点,每两个点之间是单位距离,求在限制条件下,从起点到终点访问完所有的点的最短距 ...

  8. 暑假集训(4)第四弹 -----排列,计数(hdu1465)

    题意概括:嗯,纵使你数次帮助小A脱离困境,但上一次,小A终于还是失败了.那数年的奔波与心血,抵不过轻轻一指,便彻底 湮灭,多年的友谊终归走向末路.这一切重击把小A彻底击溃! 不为什么,你到底还是要继续 ...

  9. windbg基本命令

    1, .reload k 当前调用堆栈.u 当前正在执行的代码. 2, ~ 查看被调试进程中的线程信息每一行是一个线程的信息.第一行中,0 表示这个进程的编号:1ff4.1038 是 16 进制数字, ...

  10. 集成产品开发-IPD简介

    内训IPD流程,听完后,觉的流程的力量很强大,可以高效的团队几千上万人的研发团队,来正确地为同一个目标前进.因为讲解者是从华为出来的,所以,相关的案例分析以及理解,都是以华为研发为模板来讲解的.这没错 ...