我正在使用MVC 4 Web API框架编写Web API。我正在使用BASIC
身份验证与从DelegatingHandler
继承的自定义身份验证消息处理程序。
除了我的错误处理之外,一切都工作正常。
我使用Web API作为现有身份验证机制的包装器,并在用户密码过期时抛出异常。在API动作方法中,我能够通过抛出HTTPResponseException来轻松处理这个问题,并得到一个整齐的小json对象,如下所示:
{
"Message": "Password is expired."
}
如果我在Auth Message Handler中尝试相同的方法,我会得到所有令人讨厌的.NET响应输出。
<html>
<head>
<title>Processing of the HTTP request resulted in an exception. Please see the HTTP response returned by the 'Response' property of this exception for details.</title>
<style>
body {font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;}
p {font-family:"Verdana";font-weight:normal;color:black;margin-top: -5px}
... you get the idea ...
我认为我很接近...... SendAsync
catch (Exception ex)
{
var response = request.CreateErrorResponse(HttpStatusCode.Unauthorized, ex.Message);
response.Headers.Add("WWW-Authenticate", "Basic realm=\"myrealm\"");
}
在这里,也许如果我能以某种方式从我的回复对象中获得Task<HttpResponseMessage>
返回,我想我可能会没事。
基本上我的问题是“如何真正完成异常处理,以便我能够向用户返回一个好的json / xml对象?”
还有一点要注意,这是.NET 4,而不是4.5。我已经看到了一些使用await
关键字的示例,但在这种情况下无效。
答案 0 :(得分:2)
您可以将回复包装在任务中:
catch (Exception)
{
return Task<HttpResponseMessage>.Factory.StartNew(() =>
{
var response = request.CreateErrorResponse(HttpStatusCode.Unauthorized, ex.Message);
response.Headers.Add("WWW-Authenticate", "Basic realm=\"myrealm\"");
return response;
});
}
return base.SendAsync(request, cancellationToken);