c# - 有没有办法在 ServiceStack 中手动调用路由,只使用一个字符串,否则它就是它的 URL?

标签 c# servicestack

我在 ServiceStack 中有这样一个 DTO

[Route("/skillslist/{TaskTypeId*}", WebMethods.Get)]
public class GetSkillsList : IReturn<List<SkillDto>>
{
    public long? TaskTypeId { get; set; }
}

和这样的服务方法

public List<SkillDto> Get(GetSkillsList request){...}

在另一个不相关的方法中(在同一个程序集的另一个服务上,同一个主机上),我想触发上面的路由并得到它的结果,当我只有一个像“/skillslist/5”这样的准备好的路由字符串时。

有人能告诉我怎么做吗?

最佳答案

ServiceStack 中的服务本质上只是普通的自动连接类(注入(inject)了当前的 RequestContext)。从任何服务内部,您都可以使用 base.ResolveService<TService> 所有其他服务,例如:

public object Any(AnotherRequest request)
{
    using (var service = base.ResolveService<GetSkillsService>())
    {
        List<SkillDto> results = service.Get(new GetSkillsList { ... });
    }
} 

注意:这只是一个标准的 C# 方法调用,即它只是解析来自 IOC 的服务并执行它,因此没有性能损失,因为它不执行任何 HTTP 或 DTO 反/序列化等。

并且从 ServiceStack 外部(例如在 MVC 中)您可以使用 AppHostBase.ResolveService 调用服务,例如:

using (var service = AppHostBase.ResolveService<GetSkillsService>(HttpContext.Current))
{
    List<SkillDto> results = service.Get(new GetSkillsList { ... });
}

仅使用路径信息执行服务

1) 获取 IRestPath与:

var controller = EndpointHost.Config.ServiceController;
var restPath = controller.GetRestPathForRequest("GET","/skillslist/5");

2) 创建一个新实例:

var queryString = new Dictionary<string,string>();
var request = restPath.CreateRequest("/skillslist/5", queryString, null); 

3) 然后执行:

var response = controller.Execute(request, base.RequestContext);

关于c# - 有没有办法在 ServiceStack 中手动调用路由,只使用一个字符串,否则它就是它的 URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19819636/

相关文章:

c# - 适用于 Windows 和 MS-Access 数据库和 Jet.OLEDB.4.0 的 Docker

c# - 如何计算一个值/值在数据表中出现的次数

c# - 如何将 Bitmap 转换为 Base64 字符串?

azure - GET 上的尾部斜杠会导致 Azure 上出现 404

c# - 如何让 ServiceStack 身份验证工作? (使用 iPhone 客户端)

javascript - ServiceStack AutoQuery 手动发送过滤器

c# - 从存储过程中返回错误代码值是好的做法吗?

c# - Solidworks 和 Excel C# 引用系列零件设计表

servicestack - 添加到 ExportTypes 时不在 DTO 上生成指定类型

servicestack - 如何获取客户端的IP?