代码之家  ›  专栏  ›  技术社区  ›  Léster

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

  •  1
  • Léster  · 技术社区  · 7 年前

    我的任务是维护一个ASP.NET MVC 5 WebAPI应用程序。每次使用IIS Express运行此应用程序时,它运行正常,但每次将其发布到IIS站点并尝试调用任何API方法时,都会出现以下错误:

    无法加载文件或程序集“newtonsoft.json, version=6.0.0.0,culture=neutral,publickeytoken=30ad4fe6b2a6aeed'或 它的一个依赖项。找到的程序集的清单定义不 匹配程序集引用。(来自hresult的异常: 0x80131040)

    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
    

    库版本:

    • Newtonsoft.json 10.0.3节
    • 单位4.0.1
    • Unity.aspnet.WebAPI 4.0.1
    • WebActivatorex 2.0.0版
    • 微软.NET.HTTP 2.2.29

    Unity用于整个应用程序中的依赖项注入。

    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>
    

    UnityWebapiaActivator类:

    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();
            }
        }
    

    据我所见,异常被抛出 GlobalConfiguration.Configuration.DependencyResolver = resolver; 第行,共行 UnityWebApiActivator.Start() .

    1 回复  |  直到 7 年前
        1
  •  0
  •   sellotape    7 年前

    检查实际部署的 web.config 在IIS服务器上使用的文件(Web应用程序根文件夹中的文件)中具有相同的绑定重定向。

    另请注意:任何 *.dll.config 文件没有任何效果;它们通常是在开发期间由Visual Studio添加的结果,并且通常(通常不必要)在默认情况下进行部署。