在我的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));
答案 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的位置标头并重定向到它。