ServiceStack:从URL解析请求DTO

scoob

有没有办法利用或重用内部服务堆栈url的路由到服务的解析,以获得该URL的匹配请求DTO?

例如,我们有一个服务,该服务聚集了指向不同SS服务的URL字符串列表-所有这些都生成并返回PDF:

    public class PDFAggregationService : ServiceStack.Service
{
    public BigAssPDFResponse Any(BigAssPDFRequest request)
    {
        var response = new BigAssPDFResponse();


        //does something to fetches list of pdf generating urls
        var pdfRoutes = [
               "https://server1/route1/param/2/thing/1",
               "https://server1/route1/param/3/thing/4",
               "https://server1/route2/param/1",
               "https://server1/route3/param/1"];




        var pdfBytes = new List<object>();
        pdfRoutes.ForEach(url=>
        {

            var requestDto = ???? ;  // how to resolve a DTO from a random URL? 

            var response = Gateway.Send<object>(requestDto);

            pdfBytes.Add(response);

        })


        // does something to aggregate all pdfs into one
        // pdfBytes.ForEach(...) 

        return response;


    }
}

我们要避免初始化一个JSONClient只是调用的URL,因为所有的所谓的服务都生活在同一个APPHOST作为内部PDFAggreationService(我们还想使用网关调用,以便我们可以利用已在各种请求/响应过滤器中实现的一些复杂逻辑)。

神话

我添加了一个新的Metadata.CreateRequestFromUrl()API,用于包装样板,您可以在此提交中执行此操作(现在可以从MyGet的v5.0.3中获得),可以用来执行以下操作:

var requestDto = HostContext.Metadata.CreateRequestFromUrl(url);
var responseType = HostContext.Metadata.GetResponseTypeByRequest(requestDto.GetType());
var response = Gateway.Send(responseType, requestDto);

请注意,您的请求DTO需要具有IReturn<T>标记界面才能使用服务网关。

这个新的API有效地包装了以下样板,以获取匹配的RestPath路由定义,然后您可以在其中填充/path/info和其他参数字典,然后可以通过网关发送这些参数,例如:

var pathInfo = "/route1/param/1";
var queryParams = new Dictionary<string,string> { ... };

var route = RestHandler.FindMatchingRestPath("GET", pathInfo, out _);
var reqType = route.RequestType;
var requestDto = route.CreateRequest(pathInfo, queryParams, reqType.CreateInstance());

var resType = HostContext.Metadata.GetResponseTypeByRequest(route.RequestType);
var response = Gateway.Send(resType, requestDto);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章