【问题标题】:Is RequestFilter Validation client dependent?RequestFilter Validation 客户端是否依赖?
【发布时间】:2014-02-14 17:12:23
【问题描述】:

我是否应该期望通过AppHostBase.ResolveService<>instantiating a reference service 触发请求过滤器验证(例如FluentValidation)?

到目前为止,我仅在使用 typed clients(在本例中为 JsonServiceClient)时成功收到了对 C# 应用程序的正确错误响应。

【问题讨论】:

  • 我会在今天下午进行验证。
  • protected IServiceController ServiceController on AppHostBase...不知道如何从 MVC 控制器访问它。
  • 我的机器上有整个v3 branch,但找不到HostContext.ServiceController、扩展名或其他。 ServiceStack.Common.HostContext
  • Jeremy 我已更新我的答案以包含 v3 方法,抱歉,我没有意识到您使用的是 v3,并提供了 v4 的说明。希望这会有所帮助。

标签: c# .net servicestack applicationhost servicestack-bsd


【解决方案1】:

你是对的。如果您尝试使用AppHostBase.ResolveService<T>,它不会执行任何已注册的请求过滤器。本质上它只从 AppHost 依赖容器解析服务,你只取回服务实例。因此,您的验证器不会被触发。

ServiceStack v4:

正如@mythz 指出的那样,您可以使用HostContext 的MQ 入口点API 来执行带有MQ 请求过滤器的调用,从而运行验证。为此:

HostContext.ServiceController.ExecuteMessage(new Message<T>(requestDto), httpReq);

@mythz 还指出,您可以仅使用 DTO 来执行服务,而不必确定要调用的服务和处理方法,但与AppHostBase.ResolveService&lt;T&gt; 的方式类似触发请求过滤器。用法:

HostContext.ServiceController.Execute(requestDto, httpReq)

ServiceStack v3:

GetAppHost().Config.ServiceManager.ServiceController.ExecuteMessage(new Message<T>(requestDto), httpReq);

【讨论】:

  • 您也可以只使用请求 DTO 调用服务:HostContext.ServiceController.Execute(requestDto, httpReq),这仍然不执行全局请求过滤器,但使用 MQ 入口点 API:HostContext.ServiceController.ExecuteMessage(new Message&lt;T&gt;(requestDto), httpReq) 确实执行全局MQ 请求过滤并执行 Fluent Validation。
  • @mythz 太好了。我要好好探索HostContext 源代码;这是你指出我不知道可能的伟大功能的两倍。 :)
  • 你传递的httpReq是什么?
  • @JeremySmith 如果你不通过httpReq 我相信它会从原始请求中解决上下文。相关代码is here。因此,只需尝试传递 DTO。
  • 我已经确认它确实会根据需要触发验证。奇怪的是,它只适用于POSTANY...对于任何其他方法抛出Could not find method named Post(...) or Any(...) on Service ......虽然这有效,但它有点笨拙。我可能会完全避免请求过滤器验证,而只是在服务方法中执行验证。感谢您透露这个金块!
猜你喜欢
  • 2016-08-11
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
  • 2020-11-16
  • 2016-06-02
  • 2021-01-04
  • 1970-01-01
相关资源
最近更新 更多