所以,这对我们来说是一场巨大的斗争。 我们有一个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进行广告;接到电话,我得到了同样的结果。
答案 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();
}
}
我相信这可以解决这个问题。但问题仍然存在。