c# - 为什么在调用 HtmlHelper.AntiForgeryToken 时会收到 TypeInitializationException?

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

序言

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

大家一致认为,我应该从源头报告该错误,如果我有社区意识,也许可以提出并回答有关 SO 的问题,以便其他人可能会遇到它。所以我在这里做我的社区贡献。

问题

我有一个 MVC View ,它调用 Html.AntiForgeryToken,它会在 FormatterGenerator 中抛出 TypeInitializationException。堆栈跟踪如下(对滚动条表示歉意):

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 项目。

最佳答案

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

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

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

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

关于c# - 为什么在调用 HtmlHelper.AntiForgeryToken 时会收到 TypeInitializationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3084491/

相关文章:

c# - 从 Web API 2 响应中删除 Cookie

c# - 如何从具有管理员权限的进程启动没有管理员权限的新进程?

c# - 如何在后台启动进程?

c# - 当 Controller 存在时,在 MVC 中找不到资源

asp.net-mvc - 如何在错误 View 中显示堆栈跟踪?

asp.net-mvc - 无法弄清楚为什么模型在回发时为空?

asp.net-mvc-2 - 难以了解如何在 MVC2/EF4 中处理多对多关系

c# 在不使用调度程序的情况下访问 Task 中的 ui 元素

asp.net-mvc-2 - MVC 2,将模型显示为文本框

asp.net-mvc-2 - Div 作为 Ajax.ActionLink