从ASP.NET Web API

时间:2017-03-20 18:14:59

标签: asp.net-web-api error-handling documentation

是否有记录Web API调用返回的可能错误代码的最佳做法?我指的是自定义逻辑错误而不是标准HTTP返回码。

例如,考虑允许用户更改其密码的API方法。可能的错误情况可能是该用户先前已使用所提供的新密码(即密码历史记录要求)。您可以使用以下代码将其传达给调用者:

    public HttpResponseMessage ChangePassword(string oldPassword, string newPassword)
    {
        try
        {
            passwordService.ChangePassword(oldPassword, newPassword)
            return Request.CreateResponse(HttpStatusCode.OK);
        }
        catch (Exception ex)
        {
            switch(ex.Message)
            {
                case "PasswordHistoryFailed":
                    return Request.CreateResponse(HttpStatusCode.BadRequest, new CustomErrorClass("FailedHistoryRequirements"));
                    break;
                ...
            }


        }
    }

在此示例中,我使用自定义错误类来包装自定义错误代码“FailedHistoryRequirements”。我可以为此操作添加更多错误代码,例如24小时内更改密码或其他任何内容。

我想知道是否有一种可接受的方法可以在方法的XML代码注释中自动记录这些自定义错误代码,以便文档生成器(如Swashbuckle / Swagger或类似的东西)可以使用它。

2 个答案:

答案 0 :(得分:3)

如果您使用Swagger,则可以使用SwaggerResponse属性。

查看此博文:

https://mattfrear.com/2015/04/21/generating-swagger-example-responses-with-swashbuckle/

答案 1 :(得分:1)

我是通过捕获特定的异常类型而不是解析消息来实现的。

这里我将MyDepartmentTentricBaseException作为自定义异常。我可能有2-3个异常来自它。但是通过使用基本异常,我保持我的异常捕捉清洁。

        try

        {
                    /* do something */
        }

        catch (MyDepartmentCentricBaseException deptEx)
        {
                HttpResponseException hrex = this.GetDepartmentMissingHttpResponseException(deptEx.DepartmentSurrogateKey);
                throw hrex;
        }
        catch (Exception ex)
        {
            /* log it somewhere !*/
            throw new HttpResponseException(HttpStatusCode.InternalServerError);
        }


    private HttpResponseException GetDepartmentMissingHttpResponseException(int DepartmentSurrogateKey)
    {
        HttpResponseMessage resp = new HttpResponseMessage(HttpStatusCode.NotFound)
        {
            Content = new StringContent(string.Format("No Department with DepartmentSurrogateKey = {0}", DepartmentSurrogateKey)),
            ReasonPhrase = "DepartmentSurrogateKey Not Found"
        };
        HttpResponseException returnEx = new HttpResponseException(resp);
        return returnEx;
    }

这里有其他想法:

https://docs.microsoft.com/en-us/aspnet/web-api/overview/error-handling/exception-handling

但我不知道一种自动伏都教的方法 - 它带有文档。 :(