GET上的Angular JS自定义标头转向选项

时间:2013-07-22 23:04:45

标签: angularjs http-headers asp.net-web-api

所以,这对我们来说是一场巨大的斗争。 我们有一个Web API .net MVC4后端。我们在客户端使用angular。我们有一个页面,其中包含一些我们从中接收数据的JSON。当我们对此页面进行GET时,我们会收到数据。一旦我们为调用添加自定义标头,GET就会变成OPTIONS,我们得到200,没有响应。我们正在做一些事情,比如在“登录”上创建一个BASE64代码,将其存储为cookie并尝试将其添加到GET标头中。问题是我们已经删除了所有不必要的代码,我们仍然遇到同样的问题。即使关闭数据授权也是如此。这是GET代码:

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'];

}]);

同样,如果不在调用中添加headers属性,一切正常(显然我们在API中启用了401授权)。我们愿意为此付出代价。

我们在这里公开我们的实际域名,这很好。如果有人访问www.projnik.com并点击顶部的登录链接并输入shane,用户名密码,密码,他们将收到cookie,并将用户路由回到他们将获取数据的#/ all页面,虽然它不起作用。

PS:我曾尝试使用Cookie = true进行广告;接到电话,我得到了同样的结果。

2 个答案:

答案 0 :(得分:1)

如果您是从www.projnik.com的网页访问dev.projnik.com中的API,则可以在Chrome浏览器中使用CORS。如果您在没有任何自定义标头的情况下进行GET,那么这是一个简单的CORS请求,我假设您在web.config中设置了发送Access-Control-Allow-Origin标头并使其正常工作的设置。一旦你添加了一个自定义标题,它就不再是一个简单的CORS,它就成了预先发布的CORS,浏览器发出OPTIONS请求。对此OPTIONS请求的响应必须为浏览器发送正确的CORS头以进行后续GET。要启用CORS,请检查此out。顺便说一句,在IIS中有一个默认处理程序,它响应OPTIONS调用,你可能需要remove来使Web API中的消息处理程序响应OPTIONS。

答案 1 :(得分:0)

我正在与Shane合作 - 服务器上的代码块是:

 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();
            }

        }

我相信这可以解决这个问题。但问题仍然存在。