我项目的服务器端提供了WebApi 2.2 客户端是用Ionic编写的移动应用程序 一切都在Chrome,移动应用程序中以仿真模式在本地运行。
1)在服务器上启用CORS,每个API控制器都用以下内容进行修饰:
[EnableCors(origins: "*", headers: "*", methods: "*", SupportsCredentials = true)]
2)angular $ http服务也配置为使用CORS:
$httpProvider.defaults.headers.post['Accept'] = 'application/json, text/javascript';
$httpProvider.defaults.headers.post['Content-Type'] = 'application/json; charset=utf-8';
$httpProvider.defaults.withCredentials = true;
$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];
delete $httpProvider.defaults.headers.common['X-FirePHP-Version'];
3)用户验证自己后,我将表单API控制器发送回cookie:
var cookie = new CookieHeaderValue("user-id", result.Entity.ToString());
cookie.Path = "/";
cookie.HttpOnly = true;
cookie.Secure = true;
response.Headers.AddCookies(new CookieHeaderValue[]{ cookie });
我可以在响应标题中看到这个cookie:
Set-Cookie:user-id=306d5247-1d3b-4120-b412-6ce45105397a; path=/; secure; httponly
4)在WebApi管道中,我注册了全局DelegatingHandler来读取随请求发送的cookie
对我来说,奇怪的是,当我进行POST调用时(此请求是预检的),然后在委托处理程序中,Cookie集合为空。将方法AcceptVerb(在控制器和javascript服务中)更改为GET时,修复了我的问题并且我的cookie已存在。
我的js服务是:
var setData= function (model) {
var deferred = $q.defer();
var url = stringHelper.format(endpoints.setData, sessionId);
var config = {
url: url,
method: 'POST',
data: {
name: model.name,
email: model.email
}
};
$http(config).then(function (result) {
deferred.resolve(true);
}, function (error) {
$log.debug(error);
deferred.reject(error);
});
return deferred.promise;
}
重要提示:从Postman对同一个端点进行POST调用可以正常工作。
有没有人有类似的问题? 感谢
答案 0 :(得分:0)
我终于明白了:
1)在比较工作GET请求和POST失败之后,我注意到GET没有使用OPTIONS预检,而POST是
2)在CORS definig材料中我读到OPTIONS没有发送任何cookie
作为一个解决方案,我在DelegatingHandler中添加了检查请求方法 - 所以它将OPTIONS方法传递给管道而不检查autentifiaction cookie。
希望能帮助某人:)
这是我的WebApi scanf(" %1c", &newPartie);
:
DelegatingHandler