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)
由于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 方式ReportViewer在RegisterTypes方法中注册映射。
参考:
按约定注册(MSDN)
补充参考:
Unity 容器:使用 Unity 进行依赖注入(MSDN)
| 归档时间: |
|
| 查看次数: |
960 次 |
| 最近记录: |