ServiceStack:在一个具有不同基本路径的AppHost上拥有多个独立/不同的服务



我读过另一篇帖子,我认为它提出了几乎相同的问题,但我认为我需要重新提问,才能说明为什么这很重要。

我真的不喜欢必须在不同的端口上启动几个AppHost才能承载不同的服务。我可以从端口80开始,并有我的/greatService,在端口81我有/superService等,但我当然希望所有这些都在一个端口上,所以:
mydomain.com/greatService
mydomain.com/superService

由于这些服务是相互独立的,所以我不希望在mydomain.com/metadata中有一个同时描述greatServicesuperService的元数据页面。元数据页面应位于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", "/")))

相关内容

  • 没有找到相关文章

最新更新