2014-01-15 24 views
2

確定運行ServiceStack實例的基本URL路徑的最佳方式是什麼?例如,如果我將ServiceStack配置爲在web.config的「/ api」基本URL中運行,那麼如何獲得字符串「/ api」?我想獲得這個值,以便構建任意請求DTO的URL,作爲HATEOAS樣式的文檔。獲取ServiceStack實例的基本URL

例如,如果我的請求DTO SomeRequest具有[Route("/someRequest")]屬性,則此請求的完整URL爲「/ api/someRequest」。該ToUrl擴展方法只返回基地網址下面的路徑的一部分:

new SomeRequest().ToUrl() // returns "/someRequest" 

我還沒有找到任何簡單的方法來做到這一點。看起來沒有ServiceStack公開的配置屬性返回「/ api」基本路徑值。 Inspecting web.config以獲得ServiceStack處理程序路徑可能與ServiceStack 4,但我無法弄清楚如何使用我們當前的SS 3配置。

Request.GetAbsolutePath()方法將產生當前請求的完整路徑,例如, 「/ api/someRequest」,然後我可以在這個和擴展方法ToUrl()之間做一些字符串比較來確定基本路徑,但是這也是一個非常脆弱的解決方案。

有沒有更好的方式來獲得這個基地的URL?

+0

@Scott關於servicestack-bsd標籤 - 我們將使用它來代替servicestack-v3? –

+0

我確實嘗試過[在meta上討論這個問題](http://meta.stackexchange.com/questions/210765/significant-platform-change-should-a-new-tag-be-created-servicestack)。有人反對v3特定的標籤,以防與小於3的版本有關 - 儘管我認爲它們現在不存在。但BSD似乎並不令人反感。我一直在明確適用於v3的新問題上使用它。 – Scott

+1

無論如何,我認爲我更喜歡servicestack-bsd。很高興知道。 –

回答

3

我會通過檢查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的配置直接訪問該值。

GetAppHost().Config.ServiceStackHandlerFactoryPath 

在V4中,你可以使用:

AppHost.Instance.Config.WebHostUrl 

顯然,如果UrlExtensions ToUrl()方法已經進行這樣的檢查,這將是得心應手

在V3可以從Service使用訪問相應地加上前綴。


由於@esker指出的路徑將不包括前導斜槓,所以它必須與/前綴是一個有效的靜態路徑。

+1

原來我沒有設置'ServiceStackHandlerFactoryPath'。如果將此設置爲「api」,則允許我構建如您所示的URL。這也修復了在元數據頁面上報告的URL。有一件事要注意:如果你嘗試設置一個帶有前導斜槓的「ServiceStackHandlerFactoryPath」值,比如「/ api」,斜線將被刪除。因此,使用此值生成URL時,可能需要預先加上「/」。 –

+0

@esker這是一個很好的觀點。我在底部添加了這個註釋。 – Scott