CORS Via Web API 2

前言

什么是CORS,看起来怎么有点像CQRS?
CORS是Cross-Origin Resource Sharing(跨域资源共享)的简称,简称的主要目的是为了显得高大上同时让人迷惑不解。
具体定义和介绍可以看 W3C的文档
CQRS的全称是Command Query Responsibility Seperation(命令查询职责分离),与本文无关。

介绍

CORS 是W3C(World Wide Web Consortium 万维网联盟,请注意不是复仇者联盟) 的一个规范,目的在于让JavaScript克服浏览器强加的同源策略安全限制。 同源策略意味着您的JavaScript只能使AJAX回调到包含网页的相同原点(其中“origin”被定义为主机名,协议和端口号的组合)。 例如,来自 http://localhost 的Web页面上的JavaScript不能将AJAX调用到 http://wwww.micorosoft.com (或 http://www.localhost:8086 )上的资源。

** 简单的说,就是W3C先把你的手绑起来,然后再想个法子开个后门给你松松绑,就这样。这都是他们整出来黑我大代码党的幺蛾子。**

CORS通过让服务器标注哪些资源允许被跨域调用,来放宽这个限制。 CORS由浏览器执行,但必须在服务器上实现,最新版本的ASP.NET Web API 2具有完整的CORS支持。 使用Web API 2,您可以配置策略以允许来自不同来源的JavaScript客户端访问您的API。

更详细的中文资料可以看 这儿

正文

首先,假设你知道怎么使用C#编写WebAPI,如果不懂,可以看看 十分钟快速实现WebAPI
其次,假设你知道怎么使用Postman, 懂得写前端页面,或者懂得写ASP.NET MVC,总之,你懂得写一点点JS代码。 不懂的话,可以先看看 Vue.JS 单页应用 - 联系人管理(一) 这个系列,洗洗脑先。
如果你两个都不懂,我比较好奇你是怎么点进来的?!
你前后端都懂了,我就随便说些有的没的。

  1. XMLHttpRequest cannot load XXXX. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-resource.
    这个错误通常是因为你直接使用文件管理器打开的HTML文件,而FILE协议默认并不在支持中。只要你通过HTTP协议访问就可以避免这个问题了。
    如果你确实想,非常想本地也能,咋办呢,还是有办法的...
    ** 给浏览器传入启动参数(allow-file-access-from-files),允许跨域访问。**
    Windows下,运行(CMD+R)或建立快捷方式:
    "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files
  2. Origin xxxx is not allowed by Access-Control-Allow-Origin
    错误看起来像下图,
    不允许域xxxx的请求

    这个错误,说的是你发出请求的域,没有在服务器允许的范围之内。解决方法是修改web.config,找到这样的地方,没有就添加,有的话,就看看有啥不同,简单的说就是找不同,大家来找茬。
<system.webServer>
    <httpProtocol>
        <customHeaders>
            <!-- Adding the following custom HttpHeader 
                 will help prevent CORS from stopping the Request-->
            <add name="Access-Control-Allow-Origin" value="*" />
        </customHeaders>
    </httpProtocol>
</system.webServer>

入门的时候,你就这样写,反正死不了,高手的话,反正也不需要我说,应该知道,哪儿该花点心思。

  1. Web.config中的配置参数表
<system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
      </customHeaders>
    </httpProtocol>
</system.webServer>

可以根据需要,调整自己允许的Origin, Headers以及Mothods。

  1. EnableCorsAttribute **
    EnableCorsAttribute 类用于配置CORS策略,接受三个或四个参数,这些参数分别为:
    ** 允许的域列表 **
    ** 允许的请求头列表

    ** 允许的请求方法列表**
    允许的响应头列表(可选)
    代码看起来像下面这样
public class ResourcesController : ApiController
{
  [EnableCors("http://localhost:55912", // Origin
              null,                     // Request headers
              "GET",                    // HTTP methods
              "bar",                    // Response headers
              SupportsCredentials=true  // Allow credentials
  )]
  public HttpResponseMessage Get(int id)
  {
    var resp = Request.CreateResponse(HttpStatusCode.NoContent);
    resp.Headers.Add("bar", "a bar value");
    return resp;
  }
  [EnableCors("http://localhost:55912",       // Origin
              "Accept, Origin, Content-Type", // Request headers
              "PUT",                          // HTTP methods
              PreflightMaxAge=600             // Preflight cache duration
  )]
  public HttpResponseMessage Put(Resource data)
  {
    return Request.CreateResponse(HttpStatusCode.OK, data);
  }
  [EnableCors("http://localhost:55912",       // Origin
              "Accept, Origin, Content-Type", // Request headers
              "POST",                         // HTTP methods
              PreflightMaxAge=600             // Preflight cache duration
  )]
  public HttpResponseMessage Post(Resource data)
  {
    return Request.CreateResponse(HttpStatusCode.OK, data);
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 引用自HTTP访问控制(CORS) 当 Web 资源请求由其它域名或端口提供的资源时,会发起跨域 HTTP 请求(...
    有涯逐无涯阅读 2,566评论 0 4
  • CORS (Cross-Origin Resource Sharing) 跨域资源共享 为什么需要 CORS 首先...
    小小小小诺阅读 720评论 0 5
  • 小梅子姐姐:夏季炎热的天气让我们一直躲在空调的庇护下,空调下的凉风虽然冷我们凉爽,但是如果我们使用不当,同样会对我...
    小梅子姐姐阅读 567评论 0 2
  • 第一站 国花园 名都洛阳四月天 寻访牡丹惊世颜 此花雍容谁得似 忆取当年杨玉环 春风荡漾的季节,世界的花花就在梦中...
    杨画画阅读 708评论 3 2