WebAPI在登录超时时向我发送了一个完整的HTML页面。如何在AngularJS中使用此响应?

时间:2015-11-26 08:25:45

标签: javascript angularjs asp.net-web-api

我有以下代码在我正在开发的业务应用程序的客户端调用服务(在后端使用.NET WebAPI):

resource = $resource(apiEndPointManager.endpoints.masterValues, {}, {  
    GetByCode: {
                url: '{0}/:code'.format(apiEndPointManager.endpoints.masterValues),
                method: 'GET',
                transformResponse: function(data) {
                    var response = angular.fromJson(data);

                    if (response.length) {
                        // the response is an array, so convert it into an object
                        var object = {};
                        for( var i = 0; i < response.length; i ++) {
                            object[i] = response[i];
                        }
                        return object;
                    } else {
                        return response;
                    }
                }
            },

当我登录时,此服务运行良好, data 变量填充了我需要的json数据。但是,如果我超时, data 变量将填充整个HTML页面(更具体地说是登录调度页面)。

我不知道如何处理这种情况并正确地重定向到AngularJS中的那个页面。这样做的最佳做法是什么?

谢谢

1 个答案:

答案 0 :(得分:0)

最后,我通过创建捕获响应的特殊拦截器解决了我的问题,如果响应是HTML页面,则执行重定向到登录页面。

resource = $resource(apiEndPointManager.endpoints.masterValues, {}, {  
    GetByCode: {
            url: '{0}/:code'.format(apiEndPointManager.endpoints.masterValues),
            method: 'GET',
            interceptor: resourceResponseInterceptor
    }

拦截器:

angular.module('app.services')
.factory('resourceResponseInterceptor', ['$rootScope', '$q', '$injector', function ($rootScope, $q, $injector) {

    var userContext = $injector.get('$userContext');

    return {

        response: function (response) {
            // when session is already timed out, Siteminder will return the login page with an OK code
            // so check that response is HTML and if it is redirect user to the Dispatch page
            if ($.isHtmlResponseContent(response)) {
                window.location.href = userContext.data.LogoutUrl;
                return $q.reject(response);
            }

            return response.resource;
        }
    };
}]);

$.isHtmlResponseContent = function(response) {
    var isHtmlContent = false;
    var contentType = response.headers('Content-Type');
    if (contentType) {
        isHtmlContent = contentType.indexOf('text/html') >= 0;
    }
    return isHtmlContent;
};

希望它可以帮助有同样问题的人!