3

我正在使用ServiceStack + FluentValidation v3。

我可以直接发布到 API 并体验请求验证,但是,当从我的 MVC 控制器中已解析的服务实例调用时,不会触发验证。

使用 Fiddler,我POST执行以下操作:

POST /api/json/oneway/FieldSample HTTP/1.1
Content-Type: application/json
Content-Length: 66
Host: localhost:53185

{"Sample.Id":"2866246","Sample.SampleTime":"6/7/1950 12:00:00 PM"}

响应,根据需要:

HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=utf-8
Content-Length: 138
Connection: Close

{"responseStatus":{"errorCode":"LessThan","message":"TestTest","errors":[{"errorCode":"LessThan","fieldName":"Id","message":"TestTest"}]}}

从我的 MVC 控制器:

using (var svc = AppHostBase.ResolveService<FieldSampleService>(System.Web.HttpContext.Current))
    {
        try { svc.Post(model.Sample); }
        catch (WebServiceException webEx)
        {
            return Json(new { Success = false }, "text/html");
        }
    }

不会抛出异常。

在服务中手动创建 IValidator 的实例并引发异常确实会冒泡异常。


为什么验证不会针对来自 的请求触发AppHostBase.ResolveService

4

1 回答 1

1

我在这里发现了两个发现,不过我想看看是否有任何对来源有更全面了解的人可以证实或反驳它们。


AppHostBase.ResolveService 与 JsonServiceClient

将我的连接方法更改为以下触发验证。

using (var client = new JsonServiceClient(baseUri)) {
    client.Post(model.Sample);
}

只是从 IoC 容器返回一个实例(就像它应该的AppHostBase.ResolveService那样),但我的假设是该实例仍将使用触发验证的相同请求过滤器/管道。这是有道理的,这不是我想的更多,但在考虑请求过滤器验证方法时,它的行为肯定不明显。


IReturnVoid 防止 WebServiceException

一旦我越过了这个障碍,我就会在返回 FluentValidation 错误消息时遇到问题。文档显示会抛出包含验证详细信息的WebServiceExceptiona ,但我得到的是WebException. 我终于意识到我的 Request DTO 正在实施IReturnVoid。这似乎可以确定抛出哪种类型的异常。将其更改为IReturn<any type>导致根据WebServiceException需要抛出。

于 2014-01-17T16:06:22.787 回答