我通常有如下所示的ApiController方法
[HttpPost]
public HttpResponseMessage DoSomething(int someId)
{
var someObj = Session.Get<SomeObj>(someId);
if (someObj == null)
{
return Request.CreateResponse(HttpStatusCode.NotFound);
}
Do something...
}
我想摆脱if条件。我可以只抛出NullPointerException,但是我希望能够指定要返回的HTTP状态代码。我想将if条件移至某个验证类,然后在OnActionExecuting中执行验证。
我以前曾将FluentValidation与WebAPI一起使用,并且拥有这样的语法会很好:
RuleFor(x => x.SomeId).Must(x => someObjectExists()).WithMessage("SomeObject wasn't found").WithHTTPStatusCode(HttpStatusCode.NotFound);
...其中WithHTTPStatusCode将是解决我的问题的方法。
你有什么建议吗?
最佳答案
名字真酷!
我想向您推荐这种方法。创建一个您定义的新类,称为ServiceNotFoundException或类似的类,并使其继承自HttpResponseException,并传入未作为构造函数的404,如下所示:
public class ServiceNotFoundException : HttpResponseException
{
public ServiceNotFoundException() : base(HttpStatusCode.NotFound)
{
}
}
现在,在Session.Get中,如果未在其中找到该实体,则应引发异常(因此,请将此逻辑保留在控制器之外)。
这样,如果多个控制器使用您的服务,它将在所有情况下引发异常。因为您从HttpResponseException继承并抛出NotFound,所以它将返回404。如果您需要特定的文本/消息来配合它,请使用构造函数,然后您会看到base()具有HttpResponseMessage,您可以在其中交替添加(可能在响应中设置特定的消息文本)。
如果您希望在控制器中执行此逻辑,则无论如何都可以在其中抛出异常,但是您应该尽量不要重复自己!
让我知道是否有任何问题!
关于c# - WebAPI验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22765093/