调用HtmlHelper.AntiForgeryToken时为什么会出现TypeInitializationException?

时间:2010-06-21 12:13:50

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

序言

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

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

问题

我有一个调用Html.AntiForgeryToken的MVC视图,该视图会在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 个答案:

答案 0 :(得分:4)

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

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

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

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