我读过另一篇帖子,我认为它提出了几乎相同的问题,但我认为我需要重新提问,才能说明为什么这很重要。
我真的不喜欢必须在不同的端口上启动几个AppHost才能承载不同的服务。我可以从端口80开始,并有我的/greatService
,在端口81我有/superService
等,但我当然希望所有这些都在一个端口上,所以:mydomain.com/greatService
mydomain.com/superService
由于这些服务是相互独立的,所以我不希望在mydomain.com/metadata
中有一个同时描述greatService
和superService
的元数据页面。元数据页面应位于mydomain.com/<service>/metadata
,并且仅描述该特定服务(分支)。
编辑
我刚刚意识到我在2018年提出了这个建议。
想起我在2018年的建议,我认为这是不可能的。那么,这意味着每个AppHost只能承载一个服务,因此每个端口只能承载一项服务?因此,如果您有几个独立的服务,这一定是常见的情况,建议您具体做什么?=)
Fundamentally ServiceStack主机只能有一个可通过HostContext.AppHost
单例访问的AppHost实例(每个AppDomain)。
你不能在不同的路径上逻辑地托管/装载"多个独立的服务组",你可以通过将服务模块化到不同的程序集来实现类似的结果,并让你的[Route]
明确地包括你希望托管每个服务的前缀,路由文档描述了一些选项,在这些选项中,可以通过实现自定义的自动路由生成策略来实现自动化,通过重写GetRouteAttributes()或动态添加路由属性来自定义定义的路由。
我的偏好是明确包括你想要的路线
[Route("/greetService/hello")]
public class Greet { ... }
[Route("/superService/hello")]
public class Super { ... }
属性被嵌入元数据中,因此它们只能嵌入常量,这样你就可以让所有路由使用相同的前缀,比如:
internal static class Routes
{
public const string Prefix = "/greetService";
}
[Route(Routes.Prefix + "/hello")]
public class Greet { ... }
但是,尽管它们以不同的前缀分组,但它们仍然分组在同一个/metadata
页面下。在添加ServiceStack引用功能中,如果它们被分组在不同的命名空间中,您可以使用将所有类型包括在C#命名空间中
/* Options:
IncludeTypes: MyApp.ServiceModel.Greet/*
...
*/
实现所需功能的最接近方法是使用代理功能,该功能允许您公开在不同名称或端口上以不同前缀运行的ServiceStack实例,例如:
Plugins.Add(new ProxyFeature(
matchingRequests: req => req.PathInfo.StartsWith("/techstacks"),
resolveUrl:req => $"http://{resolve(req)}.techstacks.io"+req.RawUrl.Replace("/techstacks","/")))
Plugins.Add(new ProxyFeature(
matchingRequests: req => req.PathInfo.StartsWith("/marketing"),
resolveUrl:req => "http://marketing.domain.com" + req.RawUrl.Replace("/marketing", "/")))
Plugins.Add(new ProxyFeature(
matchingRequests: req => req.PathInfo.StartsWith("/finance"),
resolveUrl:req => "http://finance.domain.com" + req.RawUrl.Replace("/finance", "/")))