错误:类型违反了继承安全规则:' System.Web.WebPages.Razor.WebPageRazorHost'

时间:2014-12-20 03:52:17

标签: c# asp.net-mvc-4 exception assembly-binding-redirect

我的ASP.NET MVC 4解决方案突然出现了这个错误:

  

继承安全规则违反了类型:' System.Web.WebPages.Razor.WebPageRazorHost'。派生类型必须与基类型的安全可访问性匹配,或者不易访问。

我用Google搜索了问题,当有人将解决方案从一个版本更新到另一个版本时,每个人都说它已经发生了。但我没有更新我的解决方案,只需将IDE从VS12更改为VS13。这是造成问题的原因吗?

完整堆栈跟踪如下:

  

[TypeLoadException:类型违反的继承安全规则:System.Web.WebPages.Razor.WebPageRazorHost&#39;。派生类型必须与基类型的安全可访问性匹配,或者不太容易访问。]      System.Web.WebPages.Razor.RazorBuildProvider.get_CodeCompilerType()+ 0      System.Web.Compilation.BuildProvider.GetCompilerTypeFromBuildProvider(BuildProvider buildProvider)+59      System.Web.Compilation.BuildProvidersCompiler.ProcessBuildProviders()+ 209      System.Web.Compilation.BuildProvidersCompiler.PerformBuild()+30      System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath)+9971917      System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath,Boolean noBuild,Boolean allowCrossApp,Boolean allowBuildInPrecompile,Boolean throwIfNotFound,Boolean ensureIsUpToDate)+299      System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context,VirtualPath virtualPath,Boolean noBuild,Boolean allowCrossApp,Boolean allowBuildInPrecompile,Boolean throwIfNotFound,Boolean ensureIsUpToDate)+103      System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath,HttpContext context,Boolean allowCrossApp,Boolean throwIfNotFound)+165      System.Web.Compilation.BuildManager.GetObjectFactory(String virtualPath,Boolean throwIfNotFound)+33      System.Web.Mvc.BuildManagerWrapper.System.Web.Mvc.IBuildManager.FileExists(String virtualPath)+40      System.Web.Mvc.BuildManagerViewEngine.FileExists(ControllerContext controllerContext,String virtualPath)+54      Microsoft.Web.Mvc.FixedRazorViewEngine.Microsoft.Web.Mvc.IViewEngineProxy.FileExists(ControllerContext controllerContext,String virtualPath)+42      Microsoft.Web.Mvc.ViewEngineFixWorker 1.FileExists(ControllerContext controllerContext, String virtualPath) +57 Microsoft.Web.Mvc.<>c__DisplayClass4.<GetPathFromGeneralName>b__0(String path) +66 System.Web.WebPages.DefaultDisplayMode.GetDisplayInfo(HttpContextBase httpContext, String virtualPath, Func 2 virtualPathExists)+90      System.Web.WebPages。&lt;&gt; c__DisplayClassb.b__8(IDisplayMode模式)+66      System.Linq.WhereSelectListIterator 2.MoveNext() +103 System.Linq.Enumerable.FirstOrDefault(IEnumerable 1 source,Func 2 predicate) +94 System.Web.WebPages.DisplayModeProvider.GetDisplayInfoForVirtualPath(String virtualPath, HttpContextBase httpContext, Func 2 virtualPathExists,IDisplayMode currentDisplayMode,Boolean requireConsistentDisplayMode)+297      System.Web.WebPages.DisplayModeProvider.GetDisplayInfoForVirtualPath(String virtualPath,HttpContextBase httpContext,Func 2 virtualPathExists, IDisplayMode currentDisplayMode) +108 Microsoft.Web.Mvc.ViewEngineFixWorker 1.GetPathFromGeneralName(ControllerContext controllerContext,List 1 locations, String name, String controllerName, String areaName, String cacheKey, String[]& searchedLocations) +653 Microsoft.Web.Mvc.ViewEngineFixWorker 1.GetPath(ControllerContext controllerContext,String [] locations,String [] areaLocations,String locationsPropertyName,String name,String controllerName,String cacheKeyPrefix,Boolean useCache,String []&amp; searchingLocations)+1508      Microsoft.Web.Mvc.ViewEngineFixWorker 1.FindView(ControllerContext controllerContext, String viewName, String masterName, Boolean useCache) +329 Microsoft.Web.Mvc.FixedRazorViewEngine.FindView(ControllerContext controllerContext, String viewName, String masterName, Boolean useCache) +66 System.Web.Mvc.<>c__DisplayClassc.<FindView>b__b(IViewEngine e) +68 System.Web.Mvc.ViewEngineCollection.Find(Func 2 lookup,Boolean trackSearchedPaths)+182      System.Web.Mvc.ViewEngineCollection.Find(Func 2 cacheLocator, Func 2 locator)+110      System.Web.Mvc.ViewEngineCollection.FindView(ControllerContext controllerContext,String viewName,String masterName)+329      System.Web.Mvc.ViewResult.FindView(ControllerContext context)+135      System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)+230      System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext,ActionResult actionResult)+39      System.Web.Mvc。&lt;&gt; c__DisplayClass1a.b__17()+74      System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter过滤器,ResultExecutingContext preContext,Func 1 continuation) +388 System.Web.Mvc.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19() +72 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList 1个过滤器,ActionResult actionResult)+303      System.Web.Mvc.Async。&lt;&gt; c__DisplayClass2a.b__20()+155      System.Web.Mvc.Async。&lt;&gt; c__DisplayClass25.b__22(IAsyncResult asyncResult)+184      System.Web.Mvc.Async.WrappedAsyncResult 1.End() +136 System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +56 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +40 System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +40 System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +47 System.Web.Mvc.Async.WrappedAsyncResult 1.End()+151      System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult,Object tag)+59      System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult,Object tag)+40      System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult)+44      System.Web.Mvc.Async。&lt;&gt; c__DisplayClass4.b__3(IAsyncResult ar)+47      System.Web.Mvc.Async.WrappedAsyncResult 1.End() +151 System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59 System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40 System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +39 System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +39 System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +45 System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +47 System.Web.Mvc.Async.WrappedAsyncResult 1.End()+151      System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult,Object tag)+59      System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult,Object tag)+40      System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)+40      System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)+38      System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+9651116      System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&amp; completedSynchronously)+155

6 个答案:

答案 0 :(得分:47)

从我的朋友克劳迪奥·雷迪的评论来看,这个问题的解决方法是:

尝试删除web.config中的System.Web.Razor程序集绑定(如果存在)。 http://forums.asp.net/t/1968686.aspx?Installed+Nuget+package+Razor+Engine+whole+system+stops

答案 1 :(得分:13)

转到Web.config并搜索程序集名称=“System.Web.Razor”并发表评论如下。

 <!--<dependentAssembly>
    <assemblyIdentity name="System.Web.Razor" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
  </dependentAssembly>-->

在评论保存并运行项目后,它将正常工作。

答案 2 :(得分:1)

对我来说,从web配置评论“System.Web.Razor”没有用。这是我为解决这个问题所做的事情。 搜索整个解决方案以获取对MvcWebRazorHostFactory的引用。你会在配置文件中找到类似下面的东西。

<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

将版本= 4.0.0.0更改为版本= 5.0.0.0,它将起作用。

答案 3 :(得分:0)

如上所述,注释掉绑定重定向适用于我的3台旧机器但不适用于第四台更新的机器。

事实证明,注释绑定重定向显然只允许找到/使用System.Web.Razor版本1.0.0.0,但我的第4台机器,一台新建的机器,缺少System.Web.Razor.DLL版本1.0。 0.0。

将System.Web.Razor版本1.0.0.0 DLL复制到网站bin文件夹中的那台机器上,然后问题解决了。删除1.0.0.0版本的DLL并返回版本2.0.0.0,问题返回。

我对绑定重定向方法起作用的机器所做的另一个发现是,一旦RazorEngine在注释掉绑定重定向后为我工作,我可以取消注释掉绑定重定向,并且RazorEngine继续工作。

答案 4 :(得分:0)

您的项目引用又链接到Microsoft.AspNet.Razor库的不同版本,它们之间是不兼容的。

您的堆栈跟踪指向System.Web.WebPages dll,该DLL可能链接到比其他NuGet程序包所引用的Microsoft.AspNet.Razor更旧的版本(例如Microsoft.AspNet.Mvc)。

要解决此问题:

  1. 如果您直接引用System.Web.WebPages,请删除引用并开始使用System.Web.WebPages NuGet包
  2. 如果您已经在使用System.Web.WebPages NuGet软件包,请将其更新为项目中已经使用的Microsoft.AspNet.Razor软件包的相同版本。

这将解决您当前的错误,但可能会导致出现一个新错误,尤其是在Microsoft.AspNet.Mvc版本之间迁移或混合软件包时。在这种情况下,您需要同步与MVC相关的所有NuGet软件包的版本。

答案 5 :(得分:0)

在使用WCF组件的Windows服务中,我遇到此错误“类型违反了继承安全性规则”。

同一服务可在另一台服务器上运行,但在特定服务器上则无法。

解决此错误的原因是注释了app.config文件中的以下行。

#!/usr/bin/php
<?php
  class test
  {
   public function __construct()
   {
   }
   public function check()
   {    
      $DirM = "/path/to/folder";    
      if (!is_dir ($DirM))
      {
    print $DirM . " Not a directory\n";
        return;
      }
      print $DirM . " is a directory\n";
   }
  }    
  $test1 = new test();
  $test1->check(); 
?>

我们花了很多时间来解决这个问题,希望对您有所帮助。