Почему я получаю TypeInitializationException при вызове HtmlHelper.AntiForgeryToken? - PullRequest
2 голосов
/ 21 июня 2010

Преамбула

Я искал, чтобы посмотреть, смогу ли я найти этот вопрос где-нибудь здесь, и я не могу. Я ранее спрашивал в мета , будет ли правильно сообщить об ошибке на SO.

Консенсус заключался в том, что я должен сообщить об ошибке в источнике, и, если я чувствую себя единомышленниками, возможно, задать вопрос и ответить на вопрос о SO, чтобы другие люди могли с ним столкнуться. Итак, я продолжаю делать свою часть сообщества.

Проблема

У меня есть вид 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 Ответ

4 голосов
/ 21 июня 2010

Это ошибка в Asp.Net Mvc (определенно 2, а также, вероятно, 1), о которой я писал в блоге о здесь (если при открытии моего блога появляется ошибка - просто обновите!), ИЯ сообщил команде MVC здесь .

Если веб-приложение размещено в виртуальном каталоге с пробелами, то внутренний механизм, который MVC использует для создания сериализатора данных для защитытокен подделки не работает.Он использует поддельный запрос страницы Asp.Net, но что-то в том, как он подделывает запрос, приводит к сбою проверки URL и неправильно определяет URL как находящийся вне текущего приложения.

Текущий обходной путь - удалить пробелыиз названия каталога приложения - хороший выбор - дефисы.Я считаю, что любые символы, для которых требуется URL-кодировка в пути, могут быть проблемой.

Причина, по которой вы можете получить эту ошибку, а коллега - нет, заключается в том, что в вашем веб-проекте вы разрешаете каждому разработчику иметьих собственная веб-привязка.По умолчанию для веб-проектов будет использоваться Cassini - что, конечно, не будет иметь этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...