在客户端中,抛出HttpResponseException总是会导致一个StatusCode: 500的响应。

3

我正在编写一个MSMVC API来处理简单的用户注册。在API中,当传递给控制器的数据无效时,我想抛出异常。

    public XmlResult RegisterByEmailAddress(UserModel model)
    {
        var errorResponse = new HttpResponseMessage(HttpStatusCode.BadRequest)
        {
            Content = new StringContent("Problem"),
            ReasonPhrase = "Problem"
        };
        throw new HttpResponseException(errorResponse);
    }

然而,无论我在异常中设置什么,客户端响应中只能看到500错误。我使用Visual Studio 2012,在本地IIS服务器上以调试模式运行API。

在Chrome Dev中实际看到的响应内容是:

方法:Get,状态:500内部服务器错误,类型text/html

是否有人知道可能的问题是什么?


看起来你那里的代码没问题(虽然你应该将 errorResponse 对象传递给异常)。在调试中,这段代码是否被执行?也许可以发布更多控制器代码?还有从响应中获取的任何其他信息吗? - Simon C
这个错误在 ExceptionFilterAttribute 中被处理了吗?将错误添加到 ResponseMessage 后,为什么要重新抛出错误? - Nilesh
@SimonC - 我已更新代码以显示整个控制器。基本上,我每次都抛出异常来进行测试。 - Richard Adams
@Nilesh - 我没有在过滤器中处理异常,我相信HttpResponse异常由框架处理? - Richard Adams
@RichardAdams 我认为你需要使用 post 方法,或者用 [HttpGet] 特性来装饰它。但这不是问题所在(否则会返回 405)。我想你还需要发送你的请求和路由信息。 - Simon C
5个回答

4
我认为根据您的回答和我刚刚进行的一些测试,您的控制器正在继承错误的基类。如果您可以发布控制器的其余部分,那么可能会更容易看出问题所在。
所有API控制器应该继承自ApiController。
MyController : ApiController

1

好的,经过多次尝试和错误,以下内容可行:

throw new HttpException((int)HttpStatusCode.BadRequest, "Invalid password provided to the Api");

这似乎与文档相反,文档(我认为)建议在开发API时抛出HttpResponseException异常。

这可能不是正确的方式,但除非有人能够解释为什么它是错误的,否则我将继续并接受自己的答案? - Richard Adams

0

我正在做类似的事情,但是在扩展的ExceptionFilterAttribute中。不确定你是否可以这样做,但想分享我目前使用的代码。这只是一个示例,因为我还有很多要添加到这个方法中。

public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
    var actionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName;
    var controllerName =
        actionExecutedContext.ActionContext.ActionDescriptor.ControllerDescriptor.ControllerName;
    Logger.LogException(controllerName + ":" + actionName, actionExecutedContext.Exception);
    actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.InternalServerError)
                                         {
                                             ReasonPhrase = YourPhrase
                                         };
}

0
如果您继承ApiController并在构造函数中抛出HttpException,则无论您传递了什么HttpStatusCode,都会收到内部服务器错误(500)。

0
如果您从构造函数或从构造函数调用的函数/方法中抛出异常,它也会返回状态500。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接