c# - WebAPI验证

扫码查看

我通常有如下所示的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/

10-12 12:45
查看更多