如何将状态401从Web API返回到AngularJS并包含自定义消息?

时间:2014-04-12 03:48:32

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

在我的WebAPI课程ApiController中,我打了一个电话,如:

string myCustomMessage = .....;

throw new HttpResponseException(
    new HttpResponseMessage(HttpStatusCode.Unauthorized)
        { ReasonPhrase = myCustomMessage });

当我使用AngularJS $resource服务进行调用时,我在promise的catch块中的状态字段中获得401。 401匹配HttpStatusCode.Unauthorized,所以很好。

然而,问题是响应的数据字段为空(null)。我没有收到myCustomMessage。

现在,如果不是抛出HttpResponseException异常,我只是抛出一条带有消息的常规Exception,该消息确实会使它回到Angular。

我需要能够做到这两点:从服务器返回自定义消息,以及返回的状态代码是我想要的,在本例中为401。

任何人都知道如何做到这一点?

[编辑] 的解决方案:

 throw new HttpResponseException(
     Request.CreateErrorResponse(HttpStatusCode.Unauthorized, myCustomMessage));

2 个答案:

答案 0 :(得分:11)

尝试像这样返回HttpResponseMessage

public HttpResponseMessage Get()
{
    return Request.CreateErrorResponse(
              HttpStatusCode.Unauthorized, "You are not authorized");
}

这应该产生这样的HTTP响应消息。

HTTP/1.1 401 Unauthorized
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/8.0
Date: Sat, 12 Apr 2014 07:12:54 GMT
Content-Length: 36

{"Message":"You are not authorized"}

答案 1 :(得分:0)

我使用响应拦截器。 响应拦截器几乎是一个"过滤器"所有响应都通过,我可以询问有关状态代码和执行逻辑。

这样的事情:

myModule.factory('responseInterceptor', function ($q) {
    return {
        response: function (res) {
           switch(res.status){
             case 401:
                     // do what you want
           }
           return res;
        },
        responseError: function (res) {
            return $q.reject(res);
        }
    };
});

myModule.config(function ($httpProvider) {
    $httpProvider.interceptors.push('responseInterceptor');
});

关于您的自定义消息,您可以将其添加到http标头中。 在我的情况下,当我得到401时,我添加了一个带有url的位置标头并重定向到它。