简体   繁体   English

发布到IIS时,ASP.NET MVC WebApi应用程序上的程序集绑定错误

[英]Assembly binding error on ASP.NET MVC WebApi application when published to IIS

I've been tasked with maintenance of a ASP.NET MVC 5 WebApi application. 我的任务是维护ASP.NET MVC 5 WebApi应用程序。 Every time I've run this application with IIS Express, it runs OK, but every time I publish it to a IIS site and try to invoke any API method, the following error appears: 每次我使用IIS Express运行此应用程序时,它都运行正常,但是每次将其发布到IIS站点并尝试调用任何API方法时,都会出现以下错误:

Could not load file or assembly 'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. 无法加载文件或程序集“ Newtonsoft.Json,版本= 6.0.0.0,区域性=中性,PublicKeyToken = 30ad4fe6b2a6aeed”或其依赖项之一。 The located assembly's manifest definition does not match the assembly reference. 找到的程序集的清单定义与程序集引用不匹配。 (Exception from HRESULT: 0x80131040) (来自HRESULT的异常:0x80131040)

Stacktrace as follows: Stacktrace如下:

[FileLoadException: Could not load file or assembly 'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)]   
System.Net.Http.Formatting.BaseJsonMediaTypeFormatter..ctor() +0   
System.Net.Http.Formatting.JsonMediaTypeFormatter..ctor() +73
System.Net.Http.Formatting.MediaTypeFormatterCollection.
    CreateDefaultFormatters() +55
System.Web.Http.HttpConfiguration.DefaultFormatters(HttpConfiguration config) +34   
System.Web.Http.HttpConfiguration..ctor(HttpRouteCollection routes) +382
System.Web.Http.GlobalConfiguration.<CreateConfiguration>b__0() +94   
System.Lazy`1.CreateValue() +708
System.Lazy`1.LazyInitValue() +184
Consalud.Seguridad.WebApi.App_Start.UnityWebApiActivator.Start() +93

[TargetInvocationException: Exception has been thrown by the target of an 
invocation.]
System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) +0
System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) +260
System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +142
System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) +34   
WebActivatorEx.BaseActivationMethodAttribute.InvokeMethod() +280   
WebActivatorEx.ActivationManager.RunActivationMethods(Boolean designerMode) +749   
WebActivatorEx.ActivationManager.RunPreStartMethods(Boolean designerMode) +49 
WebActivatorEx.ActivationManager.Run() +75

[InvalidOperationException: The pre-application start initialization method Run on type WebActivator.ActivationManager threw an exception with the following error message: Exception has been thrown by the target of an invocation.]   
System.Web.Compilation.BuildManager.InvokePreStartInitMethodsCore(ICollection`1 methods, Func`1 setHostingEnvironmentCultures) +850   
System.Web.Compilation.BuildManager.InvokePreStartInitMethods(ICollection`1 methods) +162   
System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath, Boolean& isRefAssemblyLoaded) +128   
System.Web.Compilation.BuildManager.ExecutePreAppStart() +170   
System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +820

[HttpException (0x80004005): The pre-application start initialization method Run on type WebActivator.ActivationManager threw an exception with the following error message: Exception has been thrown by the target of an invocation.]   
System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +523   
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +107    System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +688

Library versions: 库版本:

  • Newtonsoft.Json 10.0.3 Newtonsoft.Json 10.0.3
  • Unity 4.0.1 Unity 4.0.1
  • Unity.AspNet.WebApi 4.0.1 Unity.AspNet.WebApi 4.0.1
  • WebActivatorEx 2.0.0 WebActivatorEx 2.0.0
  • Microsoft.Net.Http 2.2.29 Microsoft.Net.Http 2.2.29

Unity is used for dependency injection throughout the application. Unity用于整个应用程序中的依赖项注入。

Web.config assembly redirection section: Web.config程序集重定向部分:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
        <bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
      </dependentAssembly>
      <dependentAssembly>
        <publisherPolicy apply="no" />
        <assemblyIdentity name="Oracle.ManagedDataAccess" publicKeyToken="89b483f429c47342" culture="neutral" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

UnityWebApiActivator class: UnityWebApiActivator类:

public static class UnityWebApiActivator
    {
        /// <summary>Integrates Unity when the application starts.</summary>
        public static void Start() 
        {
            // Use UnityHierarchicalDependencyResolver if you want to use a new child container for each IHttpController resolution.
            var resolver = new UnityHierarchicalDependencyResolver(UnityConfig.GetConfiguredContainer());
            // var resolver = new UnityDependencyResolver(UnityConfig.GetConfiguredContainer());

            GlobalConfiguration.Configuration.DependencyResolver = resolver;
        }

        /// <summary>Disposes the Unity container when the application is shut down.</summary>
        public static void Shutdown()
        {
            var container = UnityConfig.GetConfiguredContainer();
            container.Dispose();
        }
    }

As far as I could see, the exception is thrown in the GlobalConfiguration.Configuration.DependencyResolver = resolver; 据我所知,该异常在GlobalConfiguration.Configuration.DependencyResolver = resolver;抛出GlobalConfiguration.Configuration.DependencyResolver = resolver; line of UnityWebApiActivator.Start() . UnityWebApiActivator.Start()

Check that the actual deployed web.config file in use on the IIS server (the one in the root folder of the web application) has the same binding redirects in it. 检查IIS服务器上使用的实际已部署的web.config文件(Web应用程序的根文件夹中的文件)是否具有相同的绑定重定向。

Also of note: any *.dll.config files have no effect; 还要注意:任何*.dll.config文件均无效; they are usually a result of Visual Studio adding them during development and often they are (usually needlessly) deployed by default. 它们通常是Visual Studio在开发过程中添加它们的结果,并且通常默认情况下(通常是不必要地)部署它们。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM