angularjs $ http服务不在POST上设置cookie,但在GET中设置

时间:2015-05-10 21:48:31

标签: angularjs cookies asp.net-web-api cors ionic-framework

我项目的服务器端提供了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调用可以正常工作。

有没有人有类似的问题? 感谢

1 个答案:

答案 0 :(得分:0)

我终于明白了:

1)在比较工作GET请求和POST失败之后,我注意到GET没有使用OPTIONS预检,而POST是

2)在CORS definig材料中我读到OPTIONS没有发送任何cookie

作为一个解决方案,我在DelegatingHandler中添加了检查请求方法 - 所以它将OPTIONS方法传递给管道而不检查autentifiaction cookie。

希望能帮助某人:)

这是我的WebApi scanf(" %1c", &newPartie);

DelegatingHandler