WebAPI OData 5.0 Beta - 访问GlobalConfiguration会引发安全性错误

时间:2013-08-21 01:01:08

标签: asp.net-mvc-4 asp.net-web-api odata

我最近安装了WebApi OData 5.0框架的预发布版本,以使用新的$ expand支持。一切都很好,但我在App_Start上得到一个奇怪的例外。

Attempt by security transparent method
'System.Web.Http.GlobalConfiguration.get_Configuration()' 
to access security critical type 'System.Web.Http.HttpConfiguration' failed.

来源错误:

Line 12:    protected void Application_Start()
Line 13:    {
Line 14:        WebApiConfig.Register(GlobalConfiguration.Configuration); // <--
Line 15:    }

堆栈追踪:

[TypeAccessException: Attempt by security transparent method 'System.Web.Http.GlobalConfiguration.get_Configuration()' to access 
security critical type 'System.Web.Http.HttpConfiguration' failed.]
   System.Web.Http.GlobalConfiguration.get_Configuration() +0
   API.WebApiApplication.Application_Start() in Global.asax.cs:14

[HttpException (0x80004005): Attempt by security transparent method 'System.Web.Http.GlobalConfiguration.get_Configuration()' to access 
security critical type 'System.Web.Http.HttpConfiguration' failed.]
   System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app) +12863325
   System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +175
   System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +304
   System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +404
   System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +475

[HttpException (0x80004005): Attempt by security transparent method 'System.Web.Http.GlobalConfiguration.get_Configuration()' to access 
security critical type 'System.Web.Http.HttpConfiguration' failed.]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +12880068
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +159
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +12721257

谷歌的消息很少。

4 个答案:

答案 0 :(得分:23)

按照给定的顺序在包管理器控制台中运行以下命令:

Uninstall-Package Microsoft.AspNet.Mvc.FixedDisplayModes
Update-Package Microsoft.AspNet.Mvc -Pre
Update-Package Microsoft.AspNet.WebApi -Pre
Update-Package Microsoft.AspNet.WebApi.Tracing

现在,将以下更改应用于web.config:

  1. 在项目的Web.config中,更新应用设置网页的值:版本为3.0.0.0

  2. 在web.config中的运行时部分下,检查已配置的每个程序集的版本,并将其更新为添加到项目中的程序集版本。以下是我的web.config中的更新配置:

    &lt; runtime&gt;
    &lt; assemblyBinding xmlns =“urn:schemas-microsoft-com:asm.v1”&gt;
    &lt; dependentAssembly&gt;
    &lt; assemblyIdentity name =“System .Web.Helpers“publicKeyToken =”31bf3856ad364e35“/&gt;
    &lt; bindingRedirect oldVersion =”1.0.0.0-3.0.0.0“newVersion =”3.0.0.0“/&gt;
    &lt; / dependentAssembly&gt;
    &lt; dependentAssembly&gt;
    &lt; assemblyIdentity name =“System.Web.Mvc”publicKeyToken =“31bf3856ad364e35”/&gt;
    &lt; bindingRedirect oldVersion =“1.0.0.0-5.0.0.0” newVersion =“5.0.0.0”/&gt;
    &lt; / dependentAssembly&gt;
    &lt; dependentAssembly&gt;
    &lt; assemblyIdentity name =“System.Web.WebPages”publicKeyToken =“31bf3856ad364e35”/&gt ;
    &lt; bindingRedirect oldVersion =“1.0.0.0-3.0.0.0”newVersion =“3.0.0.0”/&gt;
    &lt; / dependentAssembly&gt;
    &lt; dependentAssembly&gt;

    &lt; assemblyIdentity name =“EntityFramework”publicKeyToken =“b77a5c561934e089”/&gt;
    &lt; bindingRedirect oldVersion =“0.0.0.0-5.0.0.0”newVersion =“5.0.0.0”/&gt;
    &lt; / dependentAssembly&gt;
    &lt; dependentAssembly&gt;
    &lt ; assemblyIdentity name =“WebGrease”publicKeyToken =“31bf3856ad364e35”/&gt;
    &lt; bindingRedirect oldVersion =“0.0.0.0-1.3.0.0”newVersion =“1.3.0.0”/&gt;
    &lt; / dependentAssembly&gt;
    &lt; dependentAssembly&gt;
    &lt; assemblyIdentity name =“System.Web.Http”publicKeyToken =“31bf3856ad364e35”culture =“neutral”/&gt;
    &lt; bindingRedirect oldVersion =“0.0 .0.0-5.0.0.0“newVersion =”5.0.0.0“/&gt;
    &lt; / dependentAssembly&gt;
    &lt; dependentAssembly&gt;
    &lt; assemblyIdentity name =”System.Net.Http。格式化“publicKeyToken =”31bf3856ad364e35“culture =”neutral“/&gt;
    &lt; bindingRedirect oldVersion =”0.0.0.0-5.0.0.0“newVersion =”5.0.0.0“/&gt;
    &lt; / dependentAssembly&gt;
    &lt; / assemblyBinding&gt;
    &lt; / runtime&gt;

    从Views文件夹中打开web.config。这里有三件事需要更新:

    1. 在configSections下,将Razor程序集的版本更新为3.0.0.0。

    2. 在system.web.webPages.razor部分更新主机版本,将System.Web.Mvc.MvcWebRazorHostFactory的版本更新为3.0.0.0。

    3. System.web的页面部分提到了一些版本号。将所有这些更新到版本5.0.0.0

    4. 如果您安装了Web API帮助页面,请检查上面的程序集配置。

答案 1 :(得分:12)

我遇到了同样的错误。我只是稍微调整了Ravi的答案,发现通过更新/安装WebApi.OData 5.0.0-rc1包来更新WebApi包对我来说效果很好。我刚刚在包管理器上运行了这些:

Update-Package Microsoft.AspNet.WebApi -Pre
Install-Package Microsoft.AspNet.WebApi.OData -Version 5.0.0

我猜测WebApi.OData包的预发布版本与新版本的WebApi包有一定的依赖性,Nuget无法将其作为依赖项进行检查。再说一遍,我在技术上是WebApi OData的新手,对包不太了解但是,是的,我可以使用$ expand和$ select功能运行项目,而不是GlobalConfiguration错误。 :)

答案 2 :(得分:1)

您需要做的就是在软件包管理器控制台中为VS解决方案运行命令“update-package Microsoft.AspNet.WebApi”

答案 3 :(得分:0)

我不确定这个的确切原因是什么,但是当其中一个nuget包是旧版本(非预发行版)时,我通常会看到此错误。您可以尝试升级所有的nuget包,看看是否会消失。