AngularJS $Resource — обратный вызов всегда запускает функцию ошибки, даже если сервер возвращает ответ HTTP 200.

Я использую службу REST, используя $resource. Почему функция обратного вызова ошибки всегда срабатывает, даже если я получаю ответ Http: 200 (ОК) от сервера? Я пробовал 2 способа настройки функций обратного вызова, и у обоих одна и та же проблема.

Вот контроллер Angular, где я использую сервис:

appRoot
.controller(
    'BatchTaskController',
    ['$scope', 'batchTaskService', function ($scope, batchTaskService){

    $scope.runImportIntermediariesTask = function () {
        batchTaskService.runImportIntermediariesTask().$promise.then(
            function (value) { alert('success') },
            function (error) { alert('error') }
            );
    };

    $scope.runImportVantageTransactionsTask = function () {
        batchTaskService.runImportVantageTransactionsTask(
            function () { alert('success'); },
            function () { alert('error'); }
            );
    };

    $scope.runProcessVantageTransactionsTask = function () { batchTaskService.runProcessVantageTransactionsTask(); };
}]);

Вот сервис Angular:

var angularVectorServices = angular.module('angularVector.services', ['ngResource']);

angularVectorServices.factory('batchTaskService', ['$resource' , function ($resource) {
return $resource(
    "http://localhost:58655/api/BatchTask/:action",
    {
        action: "@action"
    },
    {
        runImportIntermediariesTask: {
            method: "POST",
            params: {
                action: "RunImportIntermediariesTask"
            }
        },

        runImportVantageTransactionsTask: {
            method: "POST",
            params: {
                action: "RunImportVantageTransactionsTask"
            }
        },

        runProcessVantageTransactionsTask: {
            method: "POST",
            params: {
                action: "RunProcessVantageTransactionsTask"
            }
        }
    }
);
}]);

Я использую вебапи. Вот код сервера ApiController:

public HttpResponseMessage RunImportIntermediariesTask()
    {
      //  _importIntermediariesTask.Run();

        var response = Request.CreateResponse(HttpStatusCode.OK);

        return response;
    }

    public HttpResponseMessage RunImportVantageTransactionsTask()
    {
        //_importVantageTransactionsTask.Run();

        var response = Request.CreateResponse(HttpStatusCode.OK);

        return response;
    }

person Len    schedule 09.01.2014    source источник
comment
Это связано с ответом HTTP-сервера   -  person felipekm    schedule 09.01.2014
comment
Я использую WebApi и возвращаю ответ Http 200 с сервера.   -  person Len    schedule 09.01.2014
comment
в качестве первого шага отладки добавьте перехватчик $http и запишите запрос и ответ на консоль. http://docs.angularjs.org/api/ng.$http   -  person Ilan Frumer    schedule 09.01.2014
comment
Более легко, на вкладке сети chrome devtools вы можете увидеть свой запрос. Кроме того, зайдите в консоль и проверьте журнал XMLHttpRequests.   -  person Ilan Frumer    schedule 09.01.2014
comment
Да, это все просто для подтверждения того, что ваш сервер во всех случаях возвращает 200, работайте над своим объектом ответа WEB API.   -  person felipekm    schedule 09.01.2014
comment
Я использую Fiddler для просмотра запросов и ответов. Я вижу, что POST переходит к правильному действию контроллера WebApi, а заголовок ответа — «200 OK».   -  person Len    schedule 09.01.2014
comment
Эй, ты нашел решение этой проблемы? У меня точно такая же ситуация, я не знаю, что происходит. Мой бэкэнд - java, хотя я также возвращаю 200.   -  person Pablote    schedule 09.04.2014
comment
Да. Я обнаружил, что проблема была в скрипте $resource. Код javascript всегда выбирает функцию 2 при запуске в Chrome. Я решил проблему, заменив $resource на $http. $resource — это просто абстракция, построенная над $resource. В общем, я нашел $http лучшим вариантом. $resource — это дырявая, неинтуитивная и ненужная абстракция.   -  person Len    schedule 16.04.2014


Ответы (1)


Возьмите это за образец, попробуйте выполнить действие, как показано ниже, настроив код ответа кода на HttpStatusCode.Whatever:

public HttpResponseMessage GetUser(HttpRequestMessage request, int userId, DateTime lastModifiedAtClient)
{
    var user = new DataEntities().Users.First(p => p.Id == userId);
    if (user.LastModified <= lastModifiedAtClient)
    {
         return new HttpResponseMessage(HttpStatusCode.NotModified);
    }
    return request.CreateResponse(HttpStatusCode.OK, user);
}

Надеюсь это поможет.

person felipekm    schedule 09.01.2014
comment
Спасибо, Фелипе. Однако проблема, похоже, связана с браузером. Проблема возникает в Chrome. Я попробовал Internet Explorer 9, и он отлично работает. - person Len; 10.01.2014