You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET中Simple Injector与ELMAH共存时样式表请求报500错误

解决ASP.NET中Simple Injector与ELMAH共存时/elmah.axd/stylesheet返回500的问题

这个问题我之前也碰到过,本质是Simple Injector的默认构造函数选择规则和ELMAH的ManifestResourceHandler冲突了——这个Handler有两个公共构造函数,而Simple Injector默认只会自动注册那些只有一个公共构造函数的类型,所以当请求样式表时,容器尝试创建ManifestResourceHandler实例就会抛出你看到的那个错误。

下面是两种解决方案,优先选第一种,更安全可控:

方案一:手动注册ManifestResourceHandler并指定构造函数

在你的Simple Injector初始化代码里,手动注册这个Handler,明确告诉容器使用无参构造函数(这是ELMAH处理静态资源请求时依赖的构造):

// 假设container是你的Simple Injector容器实例
container.Register<ManifestResourceHandler>(
    () => new ManifestResourceHandler(), 
    Lifestyle.Transient
);

注册完成后,容器就会按照你指定的方式创建ManifestResourceHandler实例,不会再因为构造函数数量的问题报错。

方案二:全局调整Simple Injector的构造函数解析行为(不推荐)

如果你有多个类似的多构造类型需要处理,可以全局修改容器的构造函数选择规则,让它允许解析未注册的多构造类型,或者优先选择参数最多的构造函数:

// 允许解析未注册的具体类型
container.Options.ResolveUnregisteredConcreteTypes = true;
// 设置构造函数解析行为为优先选参数最多的
container.Options.ConstructorResolutionBehavior = new MostParametersConstructorResolutionBehavior();

⚠️ 注意:这种全局设置会影响整个容器的类型解析逻辑,可能带来意想不到的依赖注入问题,所以除非你确定所有类型的多构造都是安全的,否则优先用方案一。

验证一下:完成注册后,再访问/elmah.axd/stylesheet,应该就能正常返回ELMAH的样式表内容,不会再出现500错误了。

内容的提问来源于stack exchange,提问作者desm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:57:49