获取ServiceStack实例的基本URL

Mik*_*ock 2 c# hateoas servicestack servicestack-bsd

确定 ServiceStack 实例运行的基本 URL 路径的最佳方法是什么?例如,如果我将 ServiceStack 配置为在 web.config 中的“/api”基本 URL 上运行,如何获取字符串“/api”?我想获取此值以便构建任意请求 DTO 的 URL,如 HATEOAS 样式文档。

例如,如果我有一个SomeRequest带有[Route("/someRequest")]属性的请求 DTO,则该请求的完整 URL 将是“/api/someRequest”。扩展ToUrl方法仅返回基本 URL 下面的部分路径:

new SomeRequest().ToUrl() // returns "/someRequest"
Run Code Online (Sandbox Code Playgroud)

我还没有找到任何简单的方法来做到这一点。ServiceStack 似乎没有公开返回“/api”基本路径值的配置属性。在 ServiceStack 4 中可能可以检查 web.config以获取 ServiceStack 处理程序路径,但我无法弄清楚如何使用当前的 SS 3 配置来执行此操作。

Request.GetAbsolutePath()方法将生成当前请求的完整路径,例如“/api/someRequest”,然后我可以在它和扩展ToUrl()方法之间进行一些字符串比较来确定基本路径,但这似乎也是一个非常脆弱的解决方案。

有没有更好的方法来获取这个基本 URL?

Sco*_*ott 5

我将通过检查 ServiceStack AppHost 配置中的前缀来解决这个问题。来自v3 文档

为了避免与现有 ASP.NET Web 框架发生冲突,建议将 ServiceStack Web 服务托管在自定义路径中。...

下面的位置配置(到您的根 Web.config 文件)在自定义路径中托管您的 Web 服务:/api

...

您还需要在 AppHost 中配置根路径

因为 ServiceStack 希望您在 AppHost 中使用匹配的路径来配置它:

public override void Configure(Container container)
{
    SetConfig(new EndpointHostConfig { ServiceStackHandlerFactoryPath = "api" });
}
Run Code Online (Sandbox Code Playgroud)

您可以直接从 ServiceStack 的配置中访问该值。

在 v3 中,可以通过以下方式访问它Service

GetAppHost().Config.ServiceStackHandlerFactoryPath
Run Code Online (Sandbox Code Playgroud)

在 v4 中你可以使用:

AppHost.Instance.Config.WebHostUrl
Run Code Online (Sandbox Code Playgroud)

ToUrl()显然,如果 UrlExtensions方法已经执行了此检查并添加了相应的前缀,那将会很方便。


正如 @esker 所指出的,该路径将不包含前导斜杠,因此必须以 为前缀/才能成为有效的静态路径。