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.HrefおよびUrlHelper.Content ) を調べたところ、生の文字列を に渡すだけですVirtualPathUtility.ToAbsolute。VirtualPathUtility の動作に何らかの影響を与える AppHarbor 環境を除いて、これを引き起こす原因を説明することはできません。

エラーの奇妙な点は、http:/プレフィックスにスラッシュの 1 つがないことです。それが誰かのヒントになるかどうかわかりませんか?

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 構成オプションが設定されている場合、これらのトークンの 1 つが自動的に指定されます。

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">

実行時に、絶対 URL をHref呼び出しVirtualPathUtility.ToAbsoluteます。これは、相対パスを想定しているため、明らかにスローされます。

于 2013-01-08T23:30:13.747 に答える