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

1

I've been tasked with maintenance of a ASP.NET MVC 5 WebApi application. 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:

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)

Stacktrace as follows:

[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
  • Unity 4.0.1
  • Unity.AspNet.WebApi 4.0.1
  • WebActivatorEx 2.0.0
  • Microsoft.Net.Http 2.2.29

Unity is used for dependency injection throughout the application.

Web.config assembly redirection section:

<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:

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; line of UnityWebApiActivator.Start().

c#
asp.net-mvc
json.net
unity-container
asked on Stack Overflow Dec 5, 2018 by Léster • edited Dec 5, 2018 by Léster

1 Answer

0

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.

Also of note: any *.dll.config files have no effect; they are usually a result of Visual Studio adding them during development and often they are (usually needlessly) deployed by default.

answered on Stack Overflow Dec 5, 2018 by sellotape

User contributions licensed under CC BY-SA 3.0