今天我们遇到了一个CORS跨域的问题
Ajax如下

var url = "http://localhost:11980/api/Demo/GetString"; //api地址
$.ajax({
type: "get",
url: url,
data: null,
headers:
{
SecretKey: "ec8b570ad4bd403783c52ecb5cdfa849",
AppKey: "1259402909",
UniqueKey: "987654321"
},
success: function (data) {
alert(data);
}
});

如果把 headers 去掉,CORS跨域是没有问题的,但是加上就完犊子了

解决方案
Global 文件中添加一下代码

protected void Application_BeginRequest(object sender, EventArgs e)
{
var res = HttpContext.Current.Response;
var req = HttpContext.Current.Request;
//自定义header时进行处理
if (req.HttpMethod == "OPTIONS")
{
res.AppendHeader("Access-Control-Allow-Headers", "Content-Type, X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Date, X-Api-Version, X-File-Name,Token,Cookie,SecretKey,UniqueKey,AppKey");
res.AppendHeader("Access-Control-Allow-Methods", "POST,GET,PUT,PATCH,DELETE,OPTIONS");
res.AppendHeader("Access-Control-Allow-Origin", "*");
res.StatusCode = ;
res.End();
}
}

Filters

public class ActionAuthFilters : ActionFilterAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");
actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Headers", "*");
actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Methods", "*");
base.OnActionExecuted(actionExecutedContext);
}
}

Action

[ActionAuthFilters]
[HttpGet]
public string GetString()
{
return "OK";
}

解决问题

解释为啥
因为 ajax 中添加了 headers
所以浏览器会发送两次请求
第一次是OPTIONS 类型的请求,这个请求会询问服务器支持哪些请求方法(GET,POST等),支持哪些请求头等等服务器的支持情况。等到这个请求返回后,如果原来我们准备发送的请求符合服务器的规则,那么才会继续发送第二个请求,否则会在Console中报错。
第二次才是我们写的那个 Get Post 请求

所以需要在 Application_BeginRequest 中判断如果是OPTIONS 类型的请求 直接返回OK,并且告诉浏览器我们支持什么类型的请求,参数,URL
然后浏览器根据 Application_BeginRequest 中的配置在进行后续的操作

最新文章

  1. Mysql查询——深入学习
  2. [git]问题list
  3. ubuntu14使用qemu调试linux内核
  4. caffe: test code for PETA dataset
  5. Codeforces Round #341 (Div. 2) ABCDE
  6. Spring 入门 AOP
  7. (二)给IE6-IE9中的input添加HTML5新属性-placeholder
  8. 获取当前设备的IP地址
  9. Nginx基础学习(一)—Nginx的安装
  10. Html5 Canvas介绍
  11. hdu1256
  12. 树莓派中transmission的blocklist
  13. linux配置gitlab步骤
  14. xtrabackup 在线主从搭建
  15. Django学习手册 - 权限管理(二)
  16. ui-router实现返回上一页功能
  17. python学习目录(转载)
  18. python之Anaconda版本管理
  19. 010.KVM虚机冷迁移
  20. 移动端-webkit-user-select:none导致input/textarea输入框无法输入

热门文章

  1. PYQT5登录界面跳转主界面方法
  2. windows10+VS+CUDA+cuDNN+TensorFlow-gpu环境搭建(问题及解决)
  3. Parameter 'ids' not found. Available parameters are [array]
  4. 给MongoDB添加索引
  5. node+mysql,实现基本的增删改查,附带跟踪记录和运行时间记录
  6. Linux下网络配置与修改Centos7为列
  7. 美化ubuntu18.04,并安装搜狗输入法
  8. FJUTOJ-周赛2016-12-16
  9. Django2 Django MTV模板
  10. 面试题(转载csdn)