【问题标题】:Why do I get a TypeInitializationException when calling HtmlHelper.AntiForgeryToken?为什么调用 HtmlHelper.AntiForgeryToken 时会收到 TypeInitializationException?
【发布时间】:2010-06-21 12:13:49
【问题描述】:

序言

我已经搜索过是否可以在这里的任何地方找到这个问题,但我找不到。我 previously asked on meta 如果报告 SO 上的错误是有效的。

共识是我应该在源头上报告错误,如果我有社区意识,也许可以提出并回答关于 SO 的问题,以便其他人可能会遇到它。所以我在这里做我的社区工作。

问题

我有一个调用Html.AntiForgeryToken 的MVC 视图,它在FormatterGenerator 中抛出一个TypeInitializationException。堆栈跟踪如下(为滚动条道歉):

虚拟路径 '[path]' 映射到另一个应用程序,这是不允许的

[ArgumentException: 虚拟路径 '/Asp%20Net%20Bug%202008/Account/Register' 映射到另一个应用程序,这是不允许的。]
   System.Web.CachedPathData.GetVirtualPathData(VirtualPath virtualPath, Boolean permitPathsOutsideApp) +11193138
   System.Web.HttpContext.GetFilePathData() +61
   System.Web.Configuration.HttpCapabilitiesBase.GetBrowserCapabilities(HttpRequest 请求)+124
   System.Web.HttpRequest.get_Browser() +168
   System.Web.UI.Page.SetIntrinsics(HttpContext context, Boolean allowAsync) +207
   System.Web.UI.Page.ProcessRequest(HttpContext 上下文)+232
   System.Web.Mvc.TokenPersister.CreateFormatterGenerator() +459
   System.Web.Mvc.FormatterGenerator..cctor() +10

[TypeInitializationException:'FormatterGenerator' 的类型初始化程序引发了异常。]
   System.Web.Mvc.AntiForgeryDataSerializer.get_Formatter() +38
   System.Web.Mvc.AntiForgeryDataSerializer.Serialize(AntiForgeryData 令牌)+181
   System.Web.Mvc.HtmlHelper.GetAntiForgeryTokenAndSetCookie(字符串盐,字符串域,字符串路径)+405
   System.Web.Mvc.HtmlHelper.AntiForgeryToken(字符串盐,字符串域,字符串路径)+13
   System.Web.Mvc.HtmlHelper.AntiForgeryToken() +17
   ASP.views_account_register_aspx.__RenderregisterContent(HtmlTextWriter __w, Control parameterContainer) 在 c:\Users\andras.zoltan\documents\visual studio 2008\projects\aspnetbug2008\aspnetbug2008\Views\Account\Register.aspx:17
   System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter 作家,ICollection 孩子)+115
   ASP.views_shared_site_master.__Render__control1(HtmlTextWriter __w, Control parameterContainer) 在 c:\Users\andras.zoltan\documents\visual studio 2008\projects\aspnetbug2008\aspnetbug2008\Views\Shared\Site.Master:26
   System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter 作家,ICollection 孩子)+115
   System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter 作家,ICollection 孩子)+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 项目。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-2


    【解决方案1】:

    这是 Asp.Net Mvc 中的一个错误(肯定是 2 个,也可能是 1 个),我在博客中提到了 here(如果我的博客打开时出现错误 - 只需刷新!),我已经报告给MVC 团队here.

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

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

    您可能会收到此错误而同事不会收到此错误的原因是,如果在您的 Web 项目中您允许每个开发人员拥有自己的 Web 绑定。 Web 项目的默认设置是使用 Cassini - 当然不会有这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      • 2021-12-10
      • 1970-01-01
      • 2010-10-27
      • 2019-06-28
      • 2017-09-25
      • 1970-01-01
      相关资源
      最近更新 更多