最近開始撰寫Web API 專案
API的使用遇到了Cross Domain(Cross-Origin Resource Sharing)的問題
弄了好久目前終於解掉了QQ
所以來記錄一下

最早是同事使用fetch打API時出現以下錯誤


 

處理過程中發現

一開始確實是因為cors的header問題

(雖然最終是因為公司IIS設定產生預檢請求不通過  請看下一篇~)

這部分主要嘗試了兩種不同方法

 

方法一

在Web.Config中設定  

但因為這個設定會針對整個專案進行動作,如果全站皆可使用cors,可能有資安上面疑慮,所以使用方法二

    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />                                                    
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS"/>
        <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
      </customHeaders>
    </httpProtocol>

 

★關於Access-Control-Allow-Origin設定  

→ value= "*" 為允許任何來源的跨來源請求

<add name="Access-Control-Allow-Origin" value="*" />

→ value= "http://www.yourSite.com" 為允許指定來源的跨來源請求(※注意:若"指定來源"只能設定一個)

<add name="Access-Control-Allow-Origin" value="http://www.yourSite.com" />

補充:後來爬到一篇文章,不過沒有實際實作過,若有人想設定多個來源可參考看看此篇   https://dotblogs.com.tw/topcat/2014/01/12/139610

 

方法二

因為只要針對程式中某幾隻的API開放

所以後來使用了Cors套件 

1.先安裝套件

2.在 WebApiConfig.cs. 中加入以下code


public static void Register(HttpConfiguration config)
{
    // Web API configuration and services

    // Web API routes

    config.EnableCors();

    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}

3.針對使用的controller加入using 

using System.Web.Http.Cors; 

4. 在該隻程式上放上屬性設定 [EnableCors(origins: "*", headers: "*", methods: "*")]

eg:

[EnableCors(origins: "*", headers: "*", methods: "*")]
public class HomeController : ApiController
{
    [HttpGet]
    [Route("api/Home/testing")]
    public string test()
    {
       return "";
    }
}

 

 

 

文章標籤
全站熱搜
創作者介紹
創作者 andrea77222 的頭像
andrea77222

Andrea's Hello world

andrea77222 發表在 痞客邦 留言(0) 人氣(3)