1

我在ServiceStack.Razor 中呈现了一个非常基本的 html 表单ViewPage

<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.HrefUrlHelper.Content),他们所做的只是将原始字符串传递给VirtualPathUtility.ToAbsolute. 除了 AppHarbor 环境以某种方式影响 VirtualPathUtility 的功能之外,我无法解释是什么原因造成的。

错误的奇怪之处在于http:/前缀缺少一个正斜杠。不确定这是否会给任何人带来任何提示?

4

3 回答 3

1

如果您不想要 RazorFormat 中的任何替换标记,只需将其从 Razor 插件中删除,例如:

Plugins.Add(new RazorFormat { ReplaceTokens=new Dictionary<string,string>() }); 
于 2013-01-09T11:20:08.087 回答
0

你为什么不尝试这样的事情而不是你在做什么

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

于 2013-01-05T20:31:51.263 回答
0

事实证明,当使用 ServiceStack.Razor 视图引擎并结合VirtualPathUtility相关的“~”用法和EndpointHostConfig.WebHostUrl设置时,这是 ServiceStack 中的一个错误。

SS razor 视图的预编译步骤在传递给 Razor 编译器之前对构成模板的原始文本进行一些内容重写:

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

如果设置了相关的 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"

最终得到一个类似于以下内容的模板被传递给 Razor 编译器:

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

在运行时Href调用VirtualPathUtility.ToAbsolute该绝对 url,该绝对 url 显然会因为它期望相对路径而抛出。

于 2013-01-08T23:30:13.747 回答