CORS Via Web API 2

前言

什么是CORS腰奋,看起來怎么有點(diǎn)像CQRS?
CORS是Cross-Origin Resource Sharing(跨域資源共享)的簡(jiǎn)稱抱怔,簡(jiǎn)稱的主要目的是為了顯得高大上同時(shí)讓人迷惑不解劣坊。
具體定義和介紹可以看 W3C的文檔
CQRS的全稱是Command Query Responsibility Seperation(命令查詢職責(zé)分離),與本文無關(guān)屈留。

介紹

CORS 是W3C(World Wide Web Consortium 萬維網(wǎng)聯(lián)盟局冰,請(qǐng)注意不是復(fù)仇者聯(lián)盟) 的一個(gè)規(guī)范,目的在于讓JavaScript克服瀏覽器強(qiáng)加的同源策略安全限制灌危。 同源策略意味著您的JavaScript只能使AJAX回調(diào)到包含網(wǎng)頁的相同原點(diǎn)(其中“origin”被定義為主機(jī)名康二,協(xié)議和端口號(hào)的組合)。 例如勇蝙,來自 http://localhost 的Web頁面上的JavaScript不能將AJAX調(diào)用到 http://wwww.micorosoft.com (或 http://www.localhost:8086 )上的資源赠摇。

** 簡(jiǎn)單的說,就是W3C先把你的手綁起來浅蚪,然后再想個(gè)法子開個(gè)后門給你松松綁藕帜,就這樣。這都是他們整出來黑我大代碼黨的幺蛾子惜傲。**

CORS通過讓服務(wù)器標(biāo)注哪些資源允許被跨域調(diào)用洽故,來放寬這個(gè)限制。 CORS由瀏覽器執(zhí)行盗誊,但必須在服務(wù)器上實(shí)現(xiàn)时甚,最新版本的ASP.NET Web API 2具有完整的CORS支持。 使用Web API 2哈踱,您可以配置策略以允許來自不同來源的JavaScript客戶端訪問您的API荒适。

更詳細(xì)的中文資料可以看 這兒

正文

首先,假設(shè)你知道怎么使用C#編寫WebAPI开镣,如果不懂刀诬,可以看看 十分鐘快速實(shí)現(xiàn)WebAPI
其次邪财,假設(shè)你知道怎么使用Postman陕壹, 懂得寫前端頁面,或者懂得寫ASP.NET MVC树埠,總之糠馆,你懂得寫一點(diǎn)點(diǎn)JS代碼。 不懂的話怎憋,可以先看看 Vue.JS 單頁應(yīng)用 - 聯(lián)系人管理(一) 這個(gè)系列又碌,洗洗腦先九昧。
如果你兩個(gè)都不懂,我比較好奇你是怎么點(diǎn)進(jìn)來的毕匀?耽装!
你前后端都懂了,我就隨便說些有的沒的期揪。

  1. XMLHttpRequest cannot load XXXX. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-resource.
    這個(gè)錯(cuò)誤通常是因?yàn)槟阒苯邮褂梦募芾砥鞔蜷_的HTML文件,而FILE協(xié)議默認(rèn)并不在支持中规个。只要你通過HTTP協(xié)議訪問就可以避免這個(gè)問題了凤薛。
    如果你確實(shí)想,非常想本地也能诞仓,咋辦呢缤苫,還是有辦法的...
    ** 給瀏覽器傳入啟動(dòng)參數(shù)(allow-file-access-from-files),允許跨域訪問墅拭。**
    Windows下活玲,運(yùn)行(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
    錯(cuò)誤看起來像下圖,
    不允許域xxxx的請(qǐng)求

    這個(gè)錯(cuò)誤谍婉,說的是你發(fā)出請(qǐng)求的域舒憾,沒有在服務(wù)器允許的范圍之內(nèi)。解決方法是修改web.config穗熬,找到這樣的地方镀迂,沒有就添加,有的話唤蔗,就看看有啥不同探遵,簡(jiǎn)單的說就是找不同,大家來找茬妓柜。
<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>

入門的時(shí)候箱季,你就這樣寫,反正死不了棍掐,高手的話藏雏,反正也不需要我說,應(yīng)該知道作煌,哪兒該花點(diǎn)心思诉稍。

  1. Web.config中的配置參數(shù)表
<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>

可以根據(jù)需要,調(diào)整自己允許的Origin, Headers以及Mothods最疆。

  1. EnableCorsAttribute **
    EnableCorsAttribute 類用于配置CORS策略杯巨,接受三個(gè)或四個(gè)參數(shù),這些參數(shù)分別為:
    ** 允許的域列表 **
    ** 允許的請(qǐng)求頭列表

    ** 允許的請(qǐng)求方法列表**
    允許的響應(yīng)頭列表(可選)
    代碼看起來像下面這樣
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);
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末努酸,一起剝皮案震驚了整個(gè)濱河市服爷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖仍源,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件心褐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡笼踩,警方通過查閱死者的電腦和手機(jī)逗爹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嚎于,“玉大人掘而,你說我怎么就攤上這事∮诠海” “怎么了袍睡?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)肋僧。 經(jīng)常有香客問我斑胜,道長(zhǎng),這世上最難降的妖魔是什么嫌吠? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任止潘,我火速辦了婚禮,結(jié)果婚禮上辫诅,老公的妹妹穿的比我還像新娘覆山。我一直安慰自己,他們只是感情好泥栖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布簇宽。 她就那樣靜靜地躺著,像睡著了一般吧享。 火紅的嫁衣襯著肌膚如雪魏割。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天钢颂,我揣著相機(jī)與錄音钞它,去河邊找鬼。 笑死殊鞭,一個(gè)胖子當(dāng)著我的面吹牛遭垛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播操灿,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼锯仪,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了趾盐?” 一聲冷哼從身側(cè)響起庶喜,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤小腊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后久窟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秩冈,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年斥扛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了入问。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡稀颁,死狀恐怖芬失,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情峻村,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布锡凝,位于F島的核電站粘昨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏窜锯。R本人自食惡果不足惜张肾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锚扎。 院中可真熱鬧吞瞪,春花似錦、人聲如沸驾孔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翠勉。三九已至妖啥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間对碌,已是汗流浹背荆虱。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留朽们,地道東北人怀读。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像骑脱,于是被迫代替她去往敵國(guó)和親菜枷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理叁丧,服務(wù)發(fā)現(xiàn)犁跪,斷路器椿息,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 引用自HTTP訪問控制(CORS) 當(dāng) Web 資源請(qǐng)求由其它域名或端口提供的資源時(shí),會(huì)發(fā)起跨域 HTTP 請(qǐng)求(...
    有涯逐無涯閱讀 2,588評(píng)論 0 4
  • CORS (Cross-Origin Resource Sharing) 跨域資源共享 為什么需要 CORS 首先...
    小小小小諾閱讀 730評(píng)論 0 5
  • 小梅子姐姐:夏季炎熱的天氣讓我們一直躲在空調(diào)的庇護(hù)下坷衍,空調(diào)下的涼風(fēng)雖然冷我們涼爽寝优,但是如果我們使用不當(dāng),同樣會(huì)對(duì)我...
    小梅子姐姐閱讀 576評(píng)論 0 2
  • 第一站 國(guó)花園 名都洛陽四月天 尋訪牡丹驚世顏 此花雍容誰得似 憶取當(dāng)年楊玉環(huán) 春風(fēng)蕩漾的季節(jié)枫耳,世界的花花就在夢(mèng)中...
    楊畫畫閱讀 715評(píng)論 3 2