创建自定义HttpStatusCode

Aja*_*y P 0 c# http-status-codes asp.net-mvc-4 asp.net-web-api

我正在开发mvc4中的webapi.我想创建一个包含自定义一个类HttpStatusCode,其inherits HttpStatusCode类.假设我有一个signupapi需要用户详细信息,如姓名,姓氏,电子邮件,密码等.假设用户输入电子邮件abc@abc.com,我检查用户是否已经存在.如果此电子邮件已存在,我想返回Custom HttpStatusCode.假设我已经创建了1001 HttpStatusCode用于电子邮件.

我试过这样的事情

return new System.Web.Http.Results.ResponseMessageResult(
            Request.CreateErrorResponse(
                (HttpStatusCode)1001,
                new HttpError("Email is already exists.")
            )
        );
Run Code Online (Sandbox Code Playgroud)

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

Ric*_*ett 5

您不应该发明新的HTTP状态代码.我会说它充其量违反了最小惊讶原则.

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

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

Request.CreateErrorResponse(
    HttpStatusCode.BadRequest,
    new Exception("Email already exists.")
));
Run Code Online (Sandbox Code Playgroud)

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

{
    "Message":"An error has occurred.",
    "ExceptionMessage":"Email already exists.",
    "ExceptionType":"System.Exception",
    "StackTrace":null
}
Run Code Online (Sandbox Code Playgroud)


Cod*_*ter 5

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

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

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

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

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
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

正如其他人所说,不要发明自己的 HTTP 状态代码。