代码之家  ›  专栏  ›  技术社区  ›  Andras Zoltan

调用htmlhelper.AntiforgeryToken时,为什么会获得typeInitializationException?

  •  2
  • Andras Zoltan  · 技术社区  · 14 年前

    序言

    我在这里找过这个问题,但找不到。 previously asked on meta 如果报告这样的错误是有效的话。

    大家的共识是,我应该在源头上报告这个bug,如果我感到有社区意识,也许可以问这个问题,然后回答这个问题,这样其他人可能会遇到这个问题。所以我来做我的社区一点。

    问题

    我有一个MVC视图,它调用 Html.AntiForgeryToken 哪一个抛出 TypeInitializationException 在里面 FormatterGenerator . 堆栈跟踪如下(抱歉滚动条):

    The virtual path '[path]' maps to another application, which is not allowed
    
    [ArgumentException: The virtual path '/Asp%20Net%20Bug%202008/Account/Register' maps to another application, which is not allowed.]
       System.Web.CachedPathData.GetVirtualPathData(VirtualPath virtualPath, Boolean permitPathsOutsideApp) +11193138
       System.Web.HttpContext.GetFilePathData() +61
       System.Web.Configuration.HttpCapabilitiesBase.GetBrowserCapabilities(HttpRequest request) +124
       System.Web.HttpRequest.get_Browser() +168
       System.Web.UI.Page.SetIntrinsics(HttpContext context, Boolean allowAsync) +207
       System.Web.UI.Page.ProcessRequest(HttpContext context) +232
       System.Web.Mvc.TokenPersister.CreateFormatterGenerator() +459
       System.Web.Mvc.FormatterGenerator..cctor() +10
    
    [TypeInitializationException: The type initializer for 'FormatterGenerator' threw an exception.]
       System.Web.Mvc.AntiForgeryDataSerializer.get_Formatter() +38
       System.Web.Mvc.AntiForgeryDataSerializer.Serialize(AntiForgeryData token) +181
       System.Web.Mvc.HtmlHelper.GetAntiForgeryTokenAndSetCookie(String salt, String domain, String path) +405
       System.Web.Mvc.HtmlHelper.AntiForgeryToken(String salt, String domain, String path) +13
       System.Web.Mvc.HtmlHelper.AntiForgeryToken() +17
       ASP.views_account_register_aspx.__RenderregisterContent(HtmlTextWriter __w, Control parameterContainer) in c:\Users\andras.zoltan\documents\visual studio 2008\projects\aspnetbug2008\aspnetbug2008\Views\Account\Register.aspx:17
       System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +115
       ASP.views_shared_site_master.__Render__control1(HtmlTextWriter __w, Control parameterContainer) in c:\Users\andras.zoltan\documents\visual studio 2008\projects\aspnetbug2008\aspnetbug2008\Views\Shared\Site.Master:26
       System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +115
       System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +240
       System.Web.UI.Page.Render(HtmlTextWriter writer) +38
       System.Web.Mvc.ViewPage.Render(HtmlTextWriter writer) +89
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +4240

    更奇怪的是,一个同事在加载项目并运行时并没有遇到这个问题。

    我的环境是VS2008和IIS7.5;这是一个MVC2项目。

    1 回复  |  直到 14 年前
        1
  •  4
  •   Andras Zoltan    14 年前

    这是我在博客中提到的ASP.NET MVC中的一个bug(肯定是2,也可能是1)。 here (如果我的博客打开时出现错误-请刷新!)我已经向MVC团队汇报了 here .

    如果Web应用程序托管在包含空格的虚拟目录中,则MVC用于为反伪造令牌生成数据序列化程序的内部机制将无法工作。它使用了一个假的ASP.NET页面请求,但是它伪造请求的方式会导致URL验证失败,并错误地将URL标识为当前应用程序之外的URL。

    当前的解决方法是从应用程序的目录名中删除空格-连字符是一个不错的选择。我相信在路径中需要URL编码的任何字符都可能是一个问题。

    如果在您的Web项目中允许每个开发人员都有自己的Web绑定,则可能会出现此错误,并且同事不会出现此错误。Web项目的默认设置是使用cassini——当然,这不会有这个问题。