servicestack,Web Services,servicestack" /> servicestack,Web Services,servicestack" />

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

Web services ServiceStack:在一个AppHost上具有多个独立/不同的服务,具有不同的基本路径,web-services,servicestack,Web Services,servicestack,我已经读到,我认为我提出了几乎相同的问题,但我认为我需要重新提问,以便能够具体说明这一点的重要性 我真的不喜欢必须在不同的端口上启动几个AppHosts才能承载不同的服务。我可以从端口80开始使用我的/greatService,在端口81上使用/superService等,但我当然希望所有服务都在一个端口上,因此: mydomain.com/greatService mydomain.com/superService 由于这些服务相互独立,我不希望在mydomain.com/metadata上有

我已经读到,我认为我提出了几乎相同的问题,但我认为我需要重新提问,以便能够具体说明这一点的重要性

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

mydomain.com/superService

由于这些服务相互独立,我不希望在
mydomain.com/metadata
上有一个元数据页面,该页面同时描述
greatService
superService
。元数据页面应该位于
mydomain.com//metadata
,并且只描述特定的服务(分支机构)

编辑 我才意识到我是


记得我在2018年的建议,我认为这是不可能的。那么,这意味着每个AppHost只能承载一个服务,因此每个端口?因此,如果您有几个独立的服务,这肯定是一个常见的情况,建议您具体做什么?=)

ServiceStack主机只能有一个AppHost实例(每个AppDomain),可通过
HostContext.AppHost
singleton访问该实例

您不能在不同的路径上逻辑地承载/装载“多个独立的服务组”,您可以通过将“多个独立的服务组”装入不同的程序集并让您的
[Route]
明确包含您希望承载每个服务的前缀来实现类似的结果,描述了一些选项,其中可以通过实现自定义,自定义由或定义的路由

我的偏好是明确包括您想要的路线

[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实例,例如:

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", "/")))

基本上,ServiceStack主机只能有一个AppHost实例(每个AppDomain),可以通过
HostContext.AppHost
singleton访问该实例

您不能在不同的路径上逻辑地承载/装载“多个独立的服务组”,您可以通过将“多个独立的服务组”装入不同的程序集并让您的
[Route]
明确包含您希望承载每个服务的前缀来实现类似的结果,描述了一些选项,其中可以通过实现自定义,自定义由或定义的路由

我的偏好是明确包括您想要的路线

[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实例,例如:

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", "/")))

让ServiceStack支持我的场景在技术上有问题吗?或者这是你不想做的原则?我认为这是一个非常常见的场景:多个服务相互独立,但应该在同一个Web服务器上(比如说端口80)。代理功能将要求每个服务使用一个用于reach的唯一端口使用一个ServiceStack实例,以及一个作为路由器的SS实例,如上述示例所示?@Ted在同一应用程序域中支持多个AppHost从根本上是不兼容的。您只需要一个包含不同ProxyFeature配置的实例,但是如果您不想使用代理功能,最好使用反向代理,该反向代理旨在支持类似这样的用例。看看我们的和,它们都配置为在nginx反向代理后面部署多个实例。PRoxyFeature只有一个实例,但每个服务都有一个SS实例(在不同的端口上),对吗?@Ted
PRoxyFeature
基本上与反向代理做相同的工作,只是它在.NET中执行HTTP代理,它允许在路由/转换方面具有灵活性,并且不需要任何基础设施部门。您是否正在运行自托管的HttpListener应用程序?因为它可能支持在不同路径的同一端口上托管,因此,您可以在同一端口上的不同
Config.HandlerFactoryPath
上运行多个实例。
AppSelfHostBase
on.NET Framework是一个自托管HTTP侦听器,因此您可以尝试查看是否可以在同一端口上以不同路径托管不同实例(使用
SetConfig(new HostConfig)设置{HandlerFactoryPath=“greetService”}
)。已经描述了与
ServiceController的区别。执行*
,它只执行ServiceStack服务(类似于服务网关),而HTTP代理代理所有HTTP请求,即包含SS服务的所有其他资源。启用ServiceStack支持我的方案在技术上是否有问题?或者这是一个原则,您不想这样做吗?我认为这是一个非常常见的方案:多个服务相互独立,但应该位于同一个w上ebserver(比如说端口80)。代理功能要求每个服务使用一个用于reach的唯一端口,一个ServiceStack实例,以及一个作为路由器的SS实例,如上述示例所示?@Ted在同一应用程序域中支持多个AppHost根本不兼容。Yo