内部调用ServiceStack与URL &JSON

本文关键字:JSON URL 调用 ServiceStack 内部 | 更新日期: 2023-09-27 18:17:50

我有日志数据,包括原始请求体JSON和接收它的路径。当某个服务被触发时,我实际上想要运行这个。

对于日志中的每个url/json对象,我想解析服务并让它处理请求。API很大,而且还在不断增长,所以我不想手动连接每个调用。

是否有办法在内部做到这一点?不通过环回发送新的请求?

谢谢,赫克托耳

内部调用ServiceStack与URL &JSON

可以使用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是最佳选择。目前还没有任何进程间通信选项,比如命名管道。然而,我确实提交了一个命名管道的特性请求。