2013-07-22 47 views
0

因此,這對我們來說是一場巨大的鬥爭。 我們有一個web API .net MVC4後端。我們正在爲客戶端使用角度。我們有一個頁面,有一些我們從中接收數據的JSON。當我們對這個頁面進行GET時,我們會收到數據。只要我們將自定義標題添加到調用中,GET就變成了OPTIONS,我們得到了200,沒有任何迴應。我們正在做一些事情,比如在「login」上創建一個BASE64代碼,將其存儲爲一個cookie並嘗試將其添加到GET頭中。問題是我們已經刪除了所有不必要的代碼,並且仍然存在相同的問題。即使關閉了數據的授權。這裏是GET代碼:GET上的角JS自定義頭變爲選項

myApp.factory("projectDataService", function ($http, $location, $cookieStore) { 
var token = ""; 
token = $cookieStore.get('token'); 

return { 


    getProject: function (successcb) { 
     $http({ method: "GET", url: "http://dev.projnik.com/api/project", headers: { 'Authorization': 'Basic ' + token } }). 
     success(function (data, status, headers, config) { 
      successcb(data); 
     }). 
     error(function (data, status, headers, config) { 
      console.log(data, status, headers, config); 
     }); 
    }, 
    save: function (project) { 
     $http({ method: "POST", url: "http://dev.projnik.com/api/project", data: $.param(project) }). 
     success(function (data, status) { 
      if (status == '201') { 
       $location.path('/all'); 
      } 
     }) 
    } 


}; 

});

而且app.js:

var myApp = angular.module('Project', ['ngResource', 'ngCookies']); 

myApp.config(function($routeProvider){ 
    $routeProvider. 
     when('/new', {templateUrl:'templates/new.html', controller:'EditProjectController'}). 
     when('/mobile', {templateUrl:'templates/mobile.html', controller:'ProjectController'}). 
     when('/it', {templateUrl:'templates/it.html', controller:'ProjectController'}). 
     when('/writing', {templateUrl:'templates/writing.html', controller:'ProjectController'}). 
     when('/all', { templateUrl: 'templates/all.html' }). 
     when('/cookie', { templateUrl: 'partials/cookiecontrollerhtml.html' }). 
     when('/login', { templateUrl: 'partials/_login.html' }). 
     otherwise({ redirectTo: '/all' }); 
}); 

myApp.config(['$httpProvider', function($httpProvider) { 
$httpProvider.defaults.useXDomain = true; 

delete $httpProvider.defaults.headers.common['X-Requested-With']; 

}]); 

同樣,無需添加標題屬性的號召,一切正常(當然我們得到使用授權401的API中打開)。我們願意爲此付費。

我們在這裏公開我們的實際域名,這很好。如果有人訪問www.projnik.com並單擊頂部的登錄鏈接並輸入shane,用戶名密碼,密碼,他們將收到cookie,並將用戶路由回到他們將獲取數據的#/ all頁面,儘管它不起作用。 PS:我試過ad withCredentials = true;來電,我得到相同的結果。

回答

0

我與巴蒂爾在做這個 - 代碼的服務器上的塊是:

public void Application_BeginRequest(object sender, EventArgs e) 
     { 
      HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); 

      if (HttpContext.Current.Request.HttpMethod == "OPTIONS") 
      { 
       //These headers are handling the "pre-flight" OPTIONS call sent by the browser 
       HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"); 
       HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept"); 
       HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000"); 
       HttpContext.Current.Response.End(); 
      } 

     } 

我相信這需要的情況下照顧。但問題仍然存在。

+0

對於允許cookie,您需要設置一個像這樣的頭:'HttpContext.Current.Response.AddHeader(「Access-Control-Allow-Credentials」,「true」);'。確保在客戶端使用'withCredentials:true'。 – Badri

+0

當使用nuget包啓用cors時,我放置的任何其他代碼是否嘗試使此工作發生更改? – Jeff

1

如果您正在通過www.projnik.com的網頁訪問dev.projnik.com中的API,Chrome等瀏覽器會發揮CORS的作用。如果您在沒有任何自定義標題的情況下創建GET,那麼這是一個簡單的CORS請求,我假設您在web.config中設置了發送Access-Control-Allow-Origin標頭的設置,並使其工作。一旦添加了一個自定義標題,它就不再是一個簡單的CORS,並且它會在瀏覽器發出OPTIONS請求時變成預先打好的CORS。對此OPTIONS請求的響應必須爲瀏覽器發送正確的CORS頭部以進行後續GET。要啓用CORS,請檢查此out。順便說一下,在IIS中,有一個默認處理程序可以響應OPTIONS調用,您可能需要remove用於Web API中的消息處理程序來響應OPTIONS。