内部调用ServiceStack与URL &JSON
本文关键字:JSON URL 调用 ServiceStack 内部 | 更新日期: 2023-09-27 18:17:50
我有日志数据,包括原始请求体JSON和接收它的路径。当某个服务被触发时,我实际上想要运行这个。
对于日志中的每个url/json对象,我想解析服务并让它处理请求。API很大,而且还在不断增长,所以我不想手动连接每个调用。
是否有办法在内部做到这一点?不通过环回发送新的请求?
谢谢,赫克托耳
可以使用ServiceStack的BasicRequest
,它可以使用HostContext.ServiceController.Execute
方法插入ServiceStack请求管道中。
注意这个方法不会触发过滤器或依赖注入(你仍然可以在你的action方法中从容器中解析)。因此,这本质上与MQ请求的行为相同。因此,如果您的请求需要使用过滤器等,这种直接执行服务的方法可能不适合您。
这个做什么:
- 解析提供的URL以识别请求DTO类型
- 解析负责处理DTO的服务
- 调用传入DTO的action方法
- 返回DTO的结果
使用这个方法来处理请求:
static object CallInternalService(string path, string method = "GET", string jsonData = null)
{
// Determine the request dto type based on the rest path
var restPath = HostContext.ServiceController.GetRestPathForRequest(method, path);
if(restPath == null || restPath.RequestType == null)
throw new Exception("No route matched the request"); // Note no fallbacks
// Create an instance of the dto
var dto = Activator.CreateInstance(restPath.RequestType);
if(jsonData != null)
{
var data = ServiceStack.Text.JsonSerializer.DeserializeFromString(jsonData, restPath.RequestType);
dto.PopulateWith(data);
}
// Create a basic request
var request = new BasicRequest(dto, RequestAttributes.None);
// Execute the request
return HostContext.ServiceController.Execute(dto, request);
}
因此,您只需传递URL /Someaction/value
和方法POST
,以及JSON数据有效负载:
var result = CallInternalService("/users/123", "POST", "{'"Name'":'"Bob'",'"Age'":28}");
对于单向消息,Messaging API是最佳选择。目前还没有任何进程间通信选项,比如命名管道。然而,我确实提交了一个命名管道的特性请求。