2013-01-05 44 views
1

解決應用程序路徑我有一個非常基本的HTML形式被呈現在ServiceStack.RazorViewPageServiceStack.Razor ViewPageBase.Href不是AppHarbor

<form action="@Href("~/subfolder/someservice")" method="POST"> 
    <input...> 
    ... 
</form> 

它從我的本地IIS虛擬目錄的應用程序中運行時正常工作。然而,一旦部署到AppHarbor,我得到這個錯誤:

The relative virtual path 'http:/myssrazorapp.apphb.com/subfolder/someservice' is not allowed here.

[ArgumentException: The relative virtual path 'http:/myssrazorapp.apphb.com/subfolder/someservice' is not allowed here.] 
System.Web.VirtualPath.Create(String virtualPath, VirtualPathOptions options) +877 
System.Web.VirtualPath.CreateNonRelative(String virtualPath) +9 
System.Web.VirtualPathUtility.ToAbsolute(String virtualPath) +8 
ServiceStack.Html.UrlHelper.Content(String url) +6 
ServiceStack.Razor.ViewPageBase`1.Href(String url) +10 
CompiledRazorTemplates.Dynamic.dbbfcbafad.Execute() +291 
ServiceStack.Razor.Templating.TemplateService.ExecuteTemplate(T model, String name, String defaultTemplatePath, IHttpRequest httpReq, IHttpResponse httpRes) +149 
ServiceStack.Razor.RazorFormat.ExecuteTemplate(T model, String name, String templatePath, IHttpRequest httpReq, IHttpResponse httpRes) +80 
ServiceStack.Razor.RazorFormat.ProcessRazorPage(IHttpRequest httpReq, ViewPageRef razorPage, Object dto, IHttpResponse httpRes) +50 
ServiceStack.Razor.RazorHandler.ProcessRequest(IHttpRequest httpReq, IHttpResponse httpRes, String operationName) +366 
ServiceStack.WebHost.Endpoints.Support.EndpointHandlerBase.ProcessRequest(HttpContext context) +164 
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +859 
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +131 

我已經通過源代碼(ViewPageBase.HrefUrlHelper.Content)看了看,他們做的是通過對VirtualPathUtility.ToAbsolute將原始字符串。我無法解釋除了AppHarbor環境之外,會以什麼方式影響VirtualPathUtility的功能。

錯誤的怪事是http:/前綴缺少一個正斜槓。不知道這是否對任何人提出任何提示?

回答

0

你爲什麼不嘗試這樣的事情,而不是你做什麼

<form action="@Url.Action("ActionName","Controller",new{Area=""})" method="POST"> 
<input...> 
... 

+0

謝謝,但這ServiceStack.Razor,不MVC剃刀。沒有控制器或操作,只是映射到請求/響應DTO對的服務端點。儘管你確實提醒我一個好點,但我不應該在視圖中硬編碼到該服務的路由,因爲它已經被定義爲請求DTO的一個屬性。我應該有一個從DTO中讀取它的幫助器方法 - 這實際上是計劃的一部分,但我還是很執行它。儘管如此,上面也應該可以工作(href路徑也可以是一個靜態文件)。 – Tyson

0

原來這是ServiceStack的錯誤使用帶有VirtualPathUtility有關合並ServiceStack.Razor視圖引擎時,「〜」用法與EndpointHostConfig.WebHostUrl設置相結合。

的SS剃刀視圖的編譯前階段做一些content rewriting to the raw text,構成了被傳遞到剃刀編譯器之前的模板:

private string ReplaceContentWithRewriteTokens(string contents) 
{ 
    foreach (var replaceToken in ReplaceTokens) 
    { 
     contents = contents.Replace(replaceToken.Key, replaceToken.Value); 
    } 
    return contents; 
} 

其中一個tokens is automatically specified如果相關WebHostUrl配置選項設置:

var webHostUrl = appHost.Config.WebHostUrl; 
if (!webHostUrl.IsNullOrEmpty()) 
    this.ReplaceTokens["~/"] = webHostUrl.WithTrailingSlash(); 

這意味着做,因爲我在模板上面那樣:

<form action="@Href("~/subfolder/someservice")" method="POST"> 

與EndpointHostConfig.WebHostUrl =「http://myssrazorapp.apphb.com」

結束了一個模板看起來像下面被傳遞到剃刀編譯:

<form action="@Href("http://myssrazorapp.apphb.com/subfolder/someservice")" method="POST"> 

在運行時Href呼叫到VirtualPathUtility.ToAbsolute與絕對url顯然拋出,因爲它預計相對路徑。

1

如果你不想在RazorFormat任何更換令牌,不只是從剃刀插件刪除它,e.g:

Plugins.Add(new RazorFormat { ReplaceTokens=new Dictionary<string,string>() });