检测到类型 System.Web.IHttpHandler 试图覆盖现有映射

Lui*_*cia 3 c# asp.net asp.net-mvc unity-container reporting-services

当我将 asp.net mvc 应用程序复制到我们测试服务器的 IIS 文件夹时,我在该应用程序上遇到以下错误。

在本地它工作得很好:

检测到尝试覆盖名称为“”的 System.Web.IHttpHandler 类型(当前映射到 Microsoft.Reporting.WebForms.HttpHandler 类型到 Microsoft.Reporting.WebForms.HttpHandler 类型)的现有映射。

UnityConfig.cs 代码是这样的:

namespace xxx.Relacionamiento.Web.App_Start
{
    /// <summary>
    /// Specifies the Unity configuration for the main container.
    /// </summary>
    public class UnityConfig
    {
        #region Unity Container
        private static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() =>
        {
            var container = new UnityContainer();
            RegisterTypes(container);
            return container;
        });

        /// <summary>
        /// Gets the configured Unity container.
        /// </summary>
        public static IUnityContainer GetConfiguredContainer()
        {
            return container.Value;
        }
        #endregion

        /// <summary>Registers the type mappings with the Unity container.</summary>
        /// <param name="container">The unity container to configure.</param>
        /// <remarks>There is no need to register concrete types such as controllers or API controllers (unless you want to 
        /// change the defaults), as Unity allows resolving a concrete type even if it was not previously registered.</remarks>
        public static void RegisterTypes(IUnityContainer container)
        {
            // NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements.
            container.RegisterType<IUnitOfWork, EntityFrameworkUnitOfWork>(new PerRequestLifetimeManager());
            container.RegisterType<DbContext, ApplicationDbContext>(new HierarchicalLifetimeManager());
            container.RegisterType<UserManager<ApplicationUser>>(new HierarchicalLifetimeManager());
            container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new HierarchicalLifetimeManager());
            container.RegisterType<AccountController>(new InjectionConstructor(
                //new ResolvedParameter<ApplicationUserManager>("userManager"),
                //new ResolvedParameter<ApplicationSignInManager>("signInManager"),
                new ResolvedParameter<DatosExternosService>("DatosExternos"),
                new ResolvedParameter<UserRolesServices>("UserRolesServices"),
                new ResolvedParameter<AspNetUserService>("AspNetUserService"),
                new ResolvedParameter<AsesoresService>("AsesoreService"),
                new ResolvedParameter<AsociadosService>("AsociadoService")
                ));
            container.RegisterTypes(
                AllClasses.FromLoadedAssemblies(), WithMappings.FromMatchingInterface, WithName.Default
               );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

网页配置

<system.web>
    <!--<globalization uiCulture="es" culture="ES" />-->
    <globalization uiCulture="auto" culture="auto" />
    <!--<httpRuntime maxRequestLength="1048576" />-->
    <httpHandlers>
      <add path="Reserved.ReportVidewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" validate="false" />
      <add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" validate="false" />
      <add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" validate="false" />
   </httpHandlers>
    <customErrors mode="Off"></customErrors>
    <authentication mode="None" />
    <compilation debug="true" targetFramework="4.5.1">
      <assemblies>
        <add assembly="Microsoft.ReportViewer.WebForms, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
        <add assembly="Microsoft.ReportViewer.Common, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
        <add assembly="Microsoft.Build.Framework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
      </assemblies>
Run Code Online (Sandbox Code Playgroud)

我已经用谷歌搜索了错误,没有重新在此处输入图片说明sults 了。

Tet*_*oto 5

由于RegisterTypes方法 throws DuplicateTypeMappingException,您可能已经有一个注册映射,它也与定义的约定之一相匹配RegisterTypes- 这被称为“按约定注册”。

RegisterTypes方法返回IUnityContainer,其具有相对于RegistrationConvention象下面这样:

public static IUnityContainer RegisterTypes(
    this IUnityContainer container,
    RegistrationConvention convention,
    bool overwriteExistingMappings = false)
Run Code Online (Sandbox Code Playgroud)

然后,这解释了可选overwriteExistingMappings参数的工作原理:

RegisterTypes如果此方法的参数导致容器中的现有映射被覆盖,则使用此参数来控制该方法的行为。现有映射可能是通过先前调用注册一个或多个类型或在当前调用 RegisterTypes 方法期间创建的。如果此参数设置为 false,则该方法DuplicateTypeMappingException在检测到覆盖现有映射的尝试时会引发异常。如果该参数设置为 true,则该方法会使用基于该方法的其他参数的新映射覆盖现有映射。此参数的默认值为false

由于httpHandlers在 web.config中预定义了设置并默认overwriteExistingMappings设置为false,因此它会检测尝试覆盖现有httpHandlers映射并按DuplicateTypeMappingException预期抛出。

从上面的解释中,您可以尝试从此代码部分添加overwriteExistingMappings参数集为true

container.RegisterTypes(AllClasses.FromLoadedAssemblies(), WithMappings.FromMatchingInterface, WithName.Default);
Run Code Online (Sandbox Code Playgroud)

对这个:

container.RegisterTypes(AllClasses.FromLoadedAssemblies(), WithMappings.FromMatchingInterface, WithName.Default, overwriteExistingMappings: true);
Run Code Online (Sandbox Code Playgroud)

注意:这只会防止RegisterTypes在尝试覆盖现有映射时抛出异常。如果您不确定Microsoft.Reporting.WebForms.HttpHandler配置没有被覆盖,请使用 DI 方式ReportViewerRegisterTypes方法中注册映射。

参考:

按约定注册(MSDN)

补充参考:

Unity 容器:使用 Unity 进行依赖注入(MSDN)

基于约定的 Unity 注册