确定ServiceStack实例运行的基本URL路径的最佳方法是什么?例如,如果我将ServiceStack配置为在web.config中的“/ api”基本URL上运行,如何获取字符串“/ api”?我希望得到这个值,以构建任意请求DTO的URL,作为HATEOAS样式文档。
例如,如果我的请求DTO SomeRequest
具有[Route("/someRequest")]
属性,则此请求的完整网址为“/ api / someRequest”。 ToUrl
扩展方法只返回基本网址下方路径的一部分:
new SomeRequest().ToUrl() // returns "/someRequest"
我没有找到任何简单的方法来做到这一点。似乎ServiceStack没有公开的配置属性返回“/ api”基本路径值。 Inspecting web.config可以使用ServiceStack 4来获取ServiceStack处理程序路径,但是我无法确定如何使用当前的SS 3配置来实现它。
Request.GetAbsolutePath()
方法将生成当前请求的完整路径,例如“/ api / someRequest”,然后我可以在这个和ToUrl()
扩展方法之间做一些字符串比较来确定基本路径,但这似乎也是一个非常脆弱的解决方案。
有没有更好的方法来获取此基本网址?
答案 0 :(得分:4)
我会通过检查ServiceStack AppHost配置中的前缀来解决此问题。来自v3 documentation:
为避免与现有ASP.NET Web框架发生冲突,建议您在自定义路径中托管ServiceStack Web服务。 ...
位置配置(到您的根Web.config文件)
下面的以自定义路径托管您的Web服务:/api
...
您还需要在AppHost中配置根路径。
因为ServiceStack希望您在AppHost中使用匹配的路径配置它:
public override void Configure(Container container)
{
SetConfig(new EndpointHostConfig { ServiceStackHandlerFactoryPath = "api" });
}
您可以直接从ServiceStack的配置中访问该值。
在v3中,可以使用以下Service
访问它:
GetAppHost().Config.ServiceStackHandlerFactoryPath
在v4中,您可以使用:
AppHost.Instance.Config.WebHostUrl
如果UrlExtensions ToUrl()
方法已执行此检查并相应地作为前缀,那么显然会很方便。
由于@esker注意到路径不包含前导斜杠,因此它必须以/
作为前缀才能成为有效的静态路径。