创建自定义HttpStatusCode

时间:2015-01-05 11:25:03

标签: c# asp.net-mvc-4 asp.net-web-api http-status-codes

我正在 mvc4 中开发 webapi 。我想创建一个包含HttpStatusCodeinherits HttpStatusCode的自定义signup的类。假设我有一个abc@abc.com api,需要用户详细信息,如姓名,姓氏,电子邮件,密码等。假设用户输入电子邮件HttpStatusCode并检查用户是否已存在。如果此电子邮件已存在,我想返回Custom HttpStatusCode。假设我已经为已存在的电子邮件创建了 1001 return new System.Web.Http.Results.ResponseMessageResult( Request.CreateErrorResponse( (HttpStatusCode)1001, new HttpError("Email is already exists.") ) );

我试过这样的事情

return Unauthorized();

但我不知道这是否正确。当我们使用return AlreadyExists()时,这意味着它是未经授权的访问,会返回 401 错误代码。同样,我想创建一个自定义响应和状态代码。在我的情况下假设电子邮件ID已经存在,那么我应该返回这样的东西 {{1}}返回 1001 状态代码。我可以实现这样的方式吗?如果是的话,我该如何实现呢?有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:5)

您不应该发明新的HTTP状态代码。我说它至多违反了Principle of Least Astonishment

如何返回HTTP状态代码为400 (Bad Request)的响应,以及包含应用程序错误代码和消息的错误对象?

或者,您可以使用带有异常参数的CreateErrorResponse重载。

Request.CreateErrorResponse(
    HttpStatusCode.BadRequest,
    new Exception("Email already exists.")
));

这会导致从您的端点返回以下JSON:

{
    "Message":"An error has occurred.",
    "ExceptionMessage":"Email already exists.",
    "ExceptionType":"System.Exception",
    "StackTrace":null
}

答案 1 :(得分:2)

  

当我们使用return Unauthorized() [...]在我的情况下假设电子邮件ID已经存在,那么我应该返回类似这样的内容return AlreadyExists()

Unauthorized()只是基本控制器中的一个方法,您可以将方法添加到您自己的控制器中:

public IHttpActionResult AlreadyExists()
{
    return new System.Web.Http.Results.ResponseMessageResult(
        Request.CreateErrorResponse(
            (HttpStatusCode)409,
            new HttpError("Already exists")
        )
    );
}

如果要重复使用它,请添加自己的控制器基类,并让控制器继承自:

public class MyApiController : ApiController
{
    public IHttpActionResult AlreadyExists()
    {
        return new System.Web.Http.Results.ResponseMessageResult(
            Request.CreateErrorResponse(
                (HttpStatusCode)409,
                new HttpError("Already exists")
            )
        );
    }
}

public class RegisterController : MyApiController
{
    // ...
}

和其他人一样,不要发明自己的HTTP状态代码。