2016-09-20 57 views
6

問題背景:的WebAPI CORS - 訪問控制允許來源頭出現在請求錯誤

這似乎是一個常見的問題,我有下降的犯規。

我目前在Azure中託管一個標準的WebAPI和調用AngularJS應用程序,在上述的WebAPI調用一個終點。

的AngularJS應用程序URL調用到的WebAPI是:

http://siteang.azurewebsites.net 

而且的WebAPI地址是:

https://site.azurewebsites.net 

我想,以確保只有我在http://siteang.azurewebsites.net的應用程序能夠訪問的WebApi at https://site.azurewebsites.net

問題:

我收到了我的AngularJS應用到的WebAPI服務的提交形式出現以下錯誤。

XMLHttpRequest cannot load https://site.azurewebsites.net/api/ShoppingComparison/GetC…itemIndex=Baby&itemtosearch=baby&lowToHigh=false&maxPrice=50000&minPrice=0. 

Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'http://siteang.azurewebsites.net' is therefore not allowed access. The response had HTTP status code 500. 

驗證碼:

以下是$ HTTP請求到的WebAPI服務。

注意,通話的頭屬性已設置與AngularJS站點的地址。

loadSearchList: function (itemToSearch, itemIndex, countryCode) { 
     self.itemToSearch = itemToSearch; 
     self.itemCatagory = itemIndex; 
     self.country = countryCode; 

     self.searchList = []; 

     $http({ 
      method: 'GET', 
      url: 'https://site.azurewebsites.net/api/ShoppingComparison/GetComparisons', 
      params: { 
       itemtosearch: itemToSearch, 
       itemIndex: itemIndex, 
       countryCode: countryCode, 
       maxPrice: '50000', 
       minPrice: '0', 
       highToLow: true, 
       lowToHigh: false, 
       amazonEbay: true, 
       amazonOnly: false, 
       ebayOnly: false 
      }, 
      headers: { 
       'Content-Type': 'text/plain; charset=UTF-8', 
       'Access-Control-Allow-Origin': 'http://siteang.azurewebsites.net', 
       'Access-Control-Allow-Methods': 'POST, GET, OPTIONS, PUT, DELETE' 
      } 
     }).success(function (data) { 

      //Success Handler. 

     }).error(function (data) { 

      //Error Handler. 

     }); 

    } 

以下是由AngularJS應用程序調用的WebApi控制器。請注意,頭已被設置爲接受http://siteang.azurewebsites.net站點進行調用:

[System.Web.Http.HttpGet] 
    [EnableCors(origins: "http://siteang.azurewebsites.net", headers: "*", methods: "*")] 
    public ViewItemModel GetComparisons([FromUri] ComparisonRequestModel comparisonModel) 
    { 
     return _callAndSearchApis.SearchApis(comparisonModel); 
    } 

任何幫助determing爲什麼這個請求是由控制器的WebAPI拒絕將非常感激。

+0

它有認證嗎? – Dreamweaver

+1

你測試了哪些瀏覽器?有一些瀏覽器不支持CORS:http://caniuse.com/cors –

+1

你調用了'config.EnableCors();'? –

回答

7

CORS請求頭是瀏覽器跨起源請求徵收自動。沒有辦法改變它們。事實上,如果客戶端可以設置CORS允許標題,CORS將毫無意義。

您看到的錯誤是您的服務器在預檢請求期間在響應中未包含所需的Access-Control-Allow-*標頭。預檢要求(期權)是當客戶端做得比簡單的GET請求以外的東西,當添加了自定義請求頭(其中您的允許標頭是),包括進行。

公平地說,您的困惑可能沒有幫助錯誤(「...不在請求的資源」)。

我建議去除請求的CORS頭,並再次嘗試它。如果仍然失敗,請使用Fiddler等HTTP代理捕獲請求,並在預檢請求和響應中使用CORS頭更新您的問題。

2

首先,你在這裏混合協議http和https。檢查你要求的網址是否有https。請確保首先是正確的。然後你需要弄清楚服務器是否拒絕以及它在做什麼。有很多用於啓用cors的資源。即使Stackoverflow也有多個線程。

https://stackoverflow.com/search?q=Enabling+Cors+WebApi

http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

編輯答案: 有時你的IIS將與預檢OPTIONS請求干擾。嘗試在你的web.config中做這樣的事情,看看它是否工作。

http://benfoster.io/blog/aspnet-webapi-cors

+0

CORS支持HTTP-to-HTTPS跨源請求。它只是IE8/9使用的XDomain,不支持它。 –

+0

我沒有談論http-to-https請求,我沒有注意到設置了頭文件,並且認爲在請求發送的頭文件和頭文件被允許的起源之間存在差異。總之,這不是問題。 –

+0

啊我得到你。感謝澄清。 –

1

這可能是因爲你的服務器返回一個500錯誤,而這是不具有上啓用了CORS頭500錯誤響應本身。爲了確認,我鼓勵您使用像Postman這樣的工具直接測試您的API,並確保實際的API請求成功完成。

另外,您可以考慮是否需要各種服務器狀態響應消息(適用於500,403,302等)包含CORS標頭。

+0

例如:http://stackoverflow.com/questions/20108413/cors-and-internal-server-error-responses – JcT

相關問題