文档章节

WebApi中跨域解决办法

开源俱乐部
 开源俱乐部
发布于 2014/06/05 01:13
字数 538
阅读 320
收藏 2

在做Web开发中,常常会遇到跨域的问题,到目前为止,已经有非常多的跨域解决方案。由于时间有限,本文不会深入。

笔者遇到的问题是Js调用WebAPI中的数据进行跨域的场景。涉及若干跨域方案:

方案1:jsonp+回调

方案2:Microsoft.AspNet.WebApi.Cors提供的跨域属性

方案3:利用ACAO编写自定义Filter实现

一、关于方案一

方案1是同事提出来的,已经经过论证,并且自己研究过,是可行的。本质上是通过script标签动态加载js,还有callback机制。

但是,我个人觉得这个方案有些不足:

  1. 实现细节复杂,技术复杂性增大了不少,并且不好理解(服务器端、Web前端两头忙活)

  2. 只支持单向跨域

  3. 只支持Get,不支持Post等Http请求

  4. 扩展性不强

  5. 我在读参考文章时,感觉思路不清晰(至于是作者思路不清晰,还是写作思路不清晰,还是我个人理解能力不到位这个不好说。)

二、关于方案二

首先,我提出了方案2。当时在我看来,这个是比较合适的一个方案,接近完美。但是,它不可行。

原因在于:Microsoft.AspNet.WebApi.Cors的framework版本是4.5,而我们现有项目是4.0。我们的时间有限,几乎没有时间做深入研究。

三、关于方案三

我受方案2的启发,个人实现了方案3。方案3实现的最终效果接近方案2。支持:Global级别、Controller级别、Action级别。

代码如下:

using System.Web.Http.Filters;
namespace MvcApplication1.CustomFilter
{
    public class CrossSiteAttribute : ActionFilterAttribute
    {
        private const string Origin = "Origin";
        private const string AccessControlAllowOrigin = "Access-Control-Allow-Origin";
        private const string originHeaderdefault = "*";
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
             actionExecutedContext.Response.Headers.Add(AccessControlAllowOrigin, originHeaderdefault);
        }
    }
}

服务器端代码示例:

[CrossSite]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

服务器端只需要把过滤器的标签[CrossSite]写上,服务器端就支持跨域了。省去了Web前端的处理和服务器端回调的处理。

当然,它很容易进行扩展。

© 著作权归作者所有

共有 人打赏支持
开源俱乐部
粉丝 10
博文 39
码字总数 31422
作品 0
朝阳
架构师
ASP.Net中关于WebAPI与Ajax进行跨域数据交互时Cookies数据的传递

本文主要介绍了ASP.Net WebAPI与Ajax进行跨域数据交互时Cookies数据传递的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧 前言 最近公司项目进行架构调整,由原来的三层架构改进升...

科技小毛
2017/10/12
0
0
web api 初体验 解决js调用跨域问题

跨域界定 常见跨域: 同IP不同端口: http:IP:8001/api/user http:IP:8002/api/user 不同IP不同端口: http://172.28.20.100:8001/api/user http://172.128.20.100:8002/api/user 基本介绍 ......

吞吞吐吐的
2017/12/06
0
0
webapi跨域使用session

在之前的项目中,我们设置跨域都是直接在web.config中设置的。 这样是可以实现跨域访问的。因为我们这边一般情况下一个webapi会有多个网站、小程序、微信公众号等访问,所以这样设置是没有问...

zhaoshang
07/27
0
0
ASP.NET Core WebApi 跨域配置 Cors

使用Cors 要引用 Microsoft.AspNetCore.Cors 命名空间 Startup.cs customsetting.json { "Address": { "allowUrl": "http://localhost;http://localhost:8080;http://192.168.118.107;http:/......

AIU_GS
02/10
0
0
Web APi之手动实现JSONP或安装配置Cors跨域(七)

前言 照理来说本节也应该讲Web API原理,目前已经探讨完了比较底层的Web API消息处理管道以及Web Host寄宿管道,接下来应该要触及控制器、Action方法,以及过滤器、模型绑定等等,想想也是心...

jeffcky
2015/09/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java中的移位运算符

国庆给自己放了个小长期二十几天,回来继续更新专栏 上一篇文章我们说了Java里的二进制,知道了计算机是以0和1来处理数据的,在阅读源码的过程中,经常会看到这些符号<< ,>>,>>>,这些符号...

SuShine
21分钟前
2
0
linux版QQ

下载地址在这 http://yun.tzmm.com.cn/index.php/s/XRbfi6aOIjv5gwj Appimage包不用做什么别的处理,安装啥的都不需要。。找到文件所在目录,终端中修改一下文件的权限 chmod 777 QQ-2017112...

悲催的古灵武士
27分钟前
1
0
咕泡-MyBatis 实用篇作业

1. Mapper在spring管理下其实是单例,为什么可以是一个单例? 首先,mapper 内部不包含 成员字段,无状态单例是安全的 另外,一直存在不用每次调用都new 一个新实例 2. MyBatis在Spring集成下...

职业搬砖20年
30分钟前
2
0
MQTT协议的初浅认识之连接建立

MQTT百科 MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布...

亚林瓜子
47分钟前
1
0
OpenStack部署都有哪些方式

对于每一个刚接触到OpenStack的新人而言,安装无疑是最困难的,同时这也客观上提高了大家学习OpenStack云计算的技术门槛。想一想,自己3年前网上偶然接触到OpenStack时,一头茫然,手动搭建一...

tututu_jiang
47分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部