有没有办法利用或重用内部服务堆栈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] 删除。
我来说两句