AngularJS-$http错误回调不工作,即使Web API返回错误响应

AngularJS-$http错误回调不工作,即使Web API返回错误响应,angularjs,asp.net-web-api,Angularjs,Asp.net Web Api,我正在从服务器调用一个方法,该方法返回一个错误响应,比如(400&500个错误),但是我的AngularJS错误回调没有被调用,并且总是调用成功回调,即使我的状态代码包含400或500。有人能告诉我我做错了什么吗?请参见下面的angular&WebAPI代码: AngularJS代码: $http.get("/api/employee") .success(function (data, status, headers, config) { console.log(dat

我正在从服务器调用一个方法,该方法返回一个错误响应,比如(400&500个错误),但是我的AngularJS错误回调没有被调用,并且总是调用成功回调,即使我的状态代码包含400或500。有人能告诉我我做错了什么吗?请参见下面的angular&WebAPI代码:

AngularJS代码:

$http.get("/api/employee")
    .success(function (data, status, headers, config) {
        console.log(data);
        return data;
    }).error(function (data, status, headers, config) {
        alert("error");
        return status;
});
Web API代码:

public HttpResponseMessage Get(EmployeeModel employee)
{
     if (!ModelState.IsValid)
     {
         return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
     }
     //some other code
}

我从来并没有幸运地使用过.success和.error选项,最终使用了.then for everything并没有出现问题。我还应该指出,你不能像你试图做的那样,从承诺中返回价值。在输入承诺或在承诺内分配新的$scope变量之前,必须使用var声明变量

因此,通过这些更改,您的代码将如下所示:

var employees = $http({method:'GET', url:'/api/employee');
employees.then(function(data){
    $scope.employeeData = data;
}, function(data){
    //do error handling here
});

此外,拥有一个集中的方法来处理错误有时会很有帮助,这可以通过使用httpInterceptor来完成(这里详细介绍:)。这样做将允许您完全删除中的第二个函数。然后,如果没有其他错误处理需要执行,则可以节省代码和带宽。

我也有同样的问题,我自己仍在解决这个问题,但我发现了一个可能的问题

.error()
回调可能会被HTTP响应拦截器阻止执行(通过添加到
$httpProvider.interceptors
数组注册)


我使用了一个模块来添加拦截器,所以我删除了这个模块并手动编写了这些内容。

我创建了一个拦截器来捕获每个HTTP请求的延迟,并面临同样的问题。解决办法非常简单。只需替换:返回响应返回$q.拒绝(响应)。例如:

SCM.service('httpService', function($q) {
    this.request = function(config) {
        if (angular.isObject(config)) {
            config.delay = new Date().getTime();
        }
        return config;
    };
    this.requestError = function(config) {
        if (angular.isObject(config)) {
            config.delay = new Date().getTime();
        }
        return $q.reject(config);
    };
    this.response = function(response) {
        if (angular.isObject(response.config)) {
            response.config.delay = new Date().getTime() - response.config.delay;
        }
        return response;
    };
    this.responseError = function(response) {
        if (angular.isObject(response.config)) {
            response.config.delay = new Date().getTime() - response.config.delay;
        }
        return $q.reject(response);
    };
});

SCM.config(function($httpProvider) {
    $httpProvider.interceptors.push('httpService');
});

问题是有一个拦截器,它不能正确地传播错误

当一个拦截器的responseError被调用时,它必须将异常传播到调用堆栈中,这样下面的函数调用/回调就会知道在响应不成功时会出现错误

$httpProvider.interceptors.push(函数($q,$rootScope){
返回{
请求:函数(配置){
//需要返回相同的配置/修改的配置/新的配置。
返回配置;
},
requestError:函数(拒绝){
返回$q.reject(拒绝);
},
响应:功能(响应){
//需要返回相同的响应/修改的响应/或新的响应。
返回响应;
},
响应者:功能(拒绝){
返回$q.reject(拒绝);
}
};

});
你能检查浏览器网络选项卡中的响应状态吗?你的JavaScript正在调用
GET
,但是你发布了
PUT
的代码。使用浏览器调试工具或Fiddler查看发生了什么。抱歉,这是一个打字错误。另外,这是我得到的响应:HTTP/1.1 400错误请求缓存控制:无缓存Pragma:无缓存过期:-1服务器:Microsoft IIS/8.0 X-AspNet-Version:4.0.30319 X-SourceFiles:=?UTF-8?B?RDPCU2HHBLXDB25ZDHJ1Y3RPB25XWJBCGLCQ29UC3RydWN0AW9UV2VIQXBGFWAVXZDWBGLLCG=?=X-POWER-By:ASP.NET日期:Tue,2013年10月29日21:21:18 GMT内容长度:0您使用的AngularJS版本是什么?AngularJS版本1.2存在问题。[*|rc]版本。您可以升级到最新的稳定(1.2.9)版本,它可以正常工作。出于好奇,您是否使用Restanglar?我正在使用它的
addResponseInterceptor
方法,但我不确定这是否会干扰
$http
服务的拦截器。我试图从中拒绝延迟对象,但没有效果,但我认为错误拦截器(来自
setErrorInterceptor
)中有潜力,因为它似乎在处理
$http
的错误,尽管restanglar没有直接用于所讨论的调用。我没有使用restanglar谢谢,Matthias。结果是,由于某种原因,该问题只出现了500个错误。我还没有弄清楚,但我不认为Restangular是罪魁祸首。我最好的猜测是某个HTTP响应/错误拦截器返回了一个被拒绝的$q承诺,这阻止了响应/错误传播到后续拦截器。您可能需要熟悉一些角度的源代码才能完全理解它。祝你好运:)你是对的@MatthiasDailey。我在HTTP responseError拦截器中阻止了对
拒绝的访问,因为我没有返回
$q.promise(拒绝)
。有关正确用法,请参阅。