WebAPI высылает мне целую HTML-страницу по истечении времени входа в систему. Как использовать этот ответ в AngularJS?

0

У меня есть следующий код для вызова службы на клиентской стороне бизнес-приложения, которое я разрабатываю (с.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;
                    }
                }
            },

Когда я вошел в систему, эта служба работает хорошо, и переменная данных заполняется данными json, которые мне нужны. Однако, если у меня есть тайм-аут, переменная данных заполняется всей HTML-страницей (более конкретно, для страницы входа в систему).

Я понятия не имею, как мне обращаться с этой ситуацией и правильно перенаправить на эту страницу в AngularJS. Какова наилучшая практика?

спасибо

  • 1
    Ваш веб-API размещен в IIS? Если это так, я предполагаю, что причина такого поведения заключается в том, что, когда вы не авторизованы, веб-интерфейс возвращает статус «Не авторизован», а IIS перенаправляет на страницу входа, которая становится ответом на ваш запрос. Чтобы избежать этого, попробуйте разместить свой веб-интерфейс API, например, с помощью OWIN и службы Windows.
  • 0
    @xxxmatko да, это размещено в IIS. Однако я работаю в среде большой компании, и это такая политика, от которой я не могу избежать (поэтому, к сожалению, я должен придерживаться IIS ...). Есть ли другой обходной путь?
Показать ещё 1 комментарий
Теги:
asp.net-web-api

1 ответ

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

Надеюсь, это поможет кому-то с той же проблемой!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню