在身份验证处理程序中设置响应错误

时间:2013-04-16 22:50:34

标签: c# c#-4.0 asp.net-web-api httpresponse

我正在使用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关键字的示例,但在这种情况下无效。

1 个答案:

答案 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);