我正在使用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实例并抛出异常DOES冒充异常。
为什么验证不会触发来自AppHostBase.ResolveService
?
答案 0 :(得分:1)
我在这里做了两个发现,但我想看看是否有任何人对这些来源有更全面的了解可以确认或反驳它们。
AppHostBase.ResolveService与JsonServiceClient
将我的连接方法更改为以下触发验证。
using (var client = new JsonServiceClient(baseUri)) {
client.Post(model.Sample);
}
AppHostBase.ResolveService
只是从IoC容器中返回一个实例(就像它应该的那样),但我的假设是实例仍然会使用相同的请求过滤器/管道来触发验证。有意义的是,我没有考虑过它,但在考虑请求过滤器验证方法时,它的行为肯定不明显。
IReturnVoid可防止WebServiceException
一旦我越过了这个障碍,我就遇到了回收FluentValidation错误消息的问题。 docs显示会抛出包含验证详细信息的WebServiceException
,但我得到WebException
。我终于意识到我的Request DTO正在实施IReturnVoid
。这似乎决定了抛出哪种类型的异常。将其更改为IReturn<any type>
会导致WebServiceException
根据需要被抛出。