ASP.NET Core 2.2部署AWS Beanstalk时SessionStateModule程序集加载失败
问题根因
- 你在命令行直接用
dotnet命令启动应用时,调用的是.NET Core CLR,默认从当前目录加载依赖,因此可以正常运行;但IIS收到请求时,走了ASP.NET Framework的程序集查找逻辑,会优先到站点根目录下的bin子目录查找DLL,而.NET Core默认发布的所有依赖DLL都直接放在输出根目录,没有bin子目录,因此找不到对应的程序集。 - 你之前将
bindingRedirect配置写在BLL.dll.config中无效,IIS的运行时只会读取站点根目录下的web.config配置。 - .NET Core项目默认不会自动复制引用的.NET Framework类库的第三方NuGet依赖到发布输出目录。
可行解决方案
优先方案(从根源解决问题)
Microsoft.AspNet.SessionState.SessionStateModule是专为传统ASP.NET设计的NuGet包,在.NET Core环境中完全不需要使用。如果你的BLL项目中只是引用了该包但实际没有使用相关Session逻辑,直接从BLL项目中卸载该NuGet包,重新发布即可解决问题。
无法移除依赖时的解决方案
1. 强制发布时复制所有私有依赖
打开Web.API项目的.csproj文件,添加如下配置,强制发布时将所有依赖的DLL都复制到输出目录:
<PropertyGroup> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> </PropertyGroup>
2. 修正配置文件
将你之前写在BLL.dll.config中的bindingRedirect配置,移动到Web.API项目的web.config的<runtime>节点下,同时添加探针路径配置,让运行时可以从站点根目录查找DLL:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <probing privatePath="."/> <dependentAssembly> <assemblyIdentity name="Microsoft.AspNet.SessionState.SessionStateModule" publicKeyToken="31bf3856ad364e35" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-1.1.0.0" newVersion="1.1.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
3. 修正IIS应用程序池配置
打开IIS管理器,找到对应站点的应用程序池,做如下配置:
- 托管模式设置为
无托管代码 - 启用32位应用程序设置为
False - 确认应用程序池身份对部署目录拥有读取、执行权限
4. 重新发布部署
执行如下发布命令:
dotnet.exe publish -o "${publishWorkspace}\website_web_api" /property:Configuration=Debug
将发布输出的所有文件复制到IIS站点部署目录,重启应用程序池后重新访问测试即可。
内容的提问来源于stack exchange,提问作者Georgi Koemdzhiev
相关产品推荐
相关产品推荐

