我在ServiceStack.Razor ViewPage
中呈现了一个非常基本的html表单:
<form action="@Href("~/subfolder/someservice")" method="POST">
<input...>
...
</form>
从虚拟应用程序目录中的本地IIS运行时,它可以正常工作。但是,一旦部署到AppHarbor,我就会收到此错误:
此处不允许使用相对虚拟路径'http:/myssrazorapp.apphb.com/subfolder/someservice'。
[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.Href和UrlHelper.Content),他们所做的就是将原始字符串传递给VirtualPathUtility.ToAbsolute
。除了AppHarbor环境以某种方式影响VirtualPathUtility所做的事情,我无法解释是什么原因造成的。
错误的奇怪之处在于http:/
前缀缺少正斜杠之一。不确定是否会为任何人提出任何提示?
答案 0 :(得分:1)
如果你不想在RazorFormat中使用任何替换标记,那么只需从Razor插件中删除它,例如:
Plugins.Add(new RazorFormat { ReplaceTokens=new Dictionary<string,string>() });
答案 1 :(得分:0)
为什么不尝试这样的事情而不是你做的事情
<form action="@Url.Action("ActionName","Controller",new{Area=""})" method="POST">
<input...>
...
答案 2 :(得分:0)
当使用ServiceStack.Razor视图引擎并结合VirtualPathUtility
相关“〜”用法并结合EndpointHostConfig.WebHostUrl
设置时,这是ServiceStack中的一个错误。
SS剃刀视图的预编译步骤会在传递给Razor编译器之前构成模板的一些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;
}
如果设置了相关的WebHostUrl配置选项,则其中一个tokens is automatically specified:
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”
最终得到一个模板,看起来如下传递给Razor编译器:
<form action="@Href("http://myssrazorapp.apphb.com/subfolder/someservice")" method="POST">
在运行时Href
使用该绝对网址调用VirtualPathUtility.ToAbsolute
,因为它预期相对路径显然会抛出。