Blazor WebAssembly发布到AWS Beanstalk空引用异常问题咨询
Blazor WebAssembly部署到AWS Elastic Beanstalk Linux环境报错解决方案
报错场景
执行AWS EB部署命令时触发空引用异常,报错信息如下:
Configuring application bundle for a Linux deployment Writing Procfile for deployment bundle Unknown error executing command: Object reference not set to an instance of an object. at Amazon.ElasticBeanstalk.Tools.EBUtilities.SetupPackageForLinux(IToolLogger logger, EBBaseCommand command, DeployEnvironmentProperties options, String publishLocation, String reverseProxy, Nullable`1 applicationPort) at Amazon.ElasticBeanstalk.Tools.Commands.DeployEnvironmentCommand.<PerformActionAsync>d__16.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Amazon.Common.DotNetCli.Tools.Commands.BaseCommand`1.<ExecuteAsync>d__10.MoveNext()
手动上传发布包后环境仅显示默认示例页面,无业务内容。
根因说明
纯客户端Blazor WASM是纯静态站点,不包含.NET服务端运行时配置,AWS EB工具默认扫描.NET服务端项目的配置文件,扫描不到对应内容就会抛出空引用异常。如果选择了.NET Core类的EB环境,环境默认会寻找服务端启动程序,找不到的话就会加载默认示例页面,不会识别静态WASM文件。
可行解决方案
方案一:Nginx平台托管(推荐,资源占用更低)
纯静态WASM直接用Nginx环境托管即可,无需使用.NET运行环境,步骤如下:
- 本地发布Blazor WASM项目,发布配置选Release,目标运行时选择「可移植」即可,无需指定linux-x64,发布后拿到所有产出的静态文件
- 在发布文件根目录(和index.html同级)创建
Procfile文件,内容为:web: nginx -g 'daemon off;' - 按层级创建目录
.platform/nginx/conf.d/elasticbeanstalk/,在该目录下新增00_application.conf配置文件,内容为:
该配置用于解决WASM前端路由刷新404的问题,同时指定静态文件的加载根目录location / { root /var/app/current; index index.html index.htm; try_files $uri $uri/ /index.html =404; } - 将所有发布文件、Procfile、.platform文件夹打包为zip包,注意zip根目录直接包含上述文件,不要额外套一层外层文件夹
- 到AWS EB控制台创建新环境,平台选择「Nginx」,上传上述zip包部署即可正常访问
方案二:ASP.NET Core托管部署
如果需要复用已有的.NET EB环境,可以给Blazor WASM套一层ASP.NET Core服务端外壳:
- 新建ASP.NET Core托管的Blazor WASM项目,将原有WASM的业务代码迁移到客户端子项目中
- 直接用AWS Toolkit一键部署服务端项目即可,工具可以识别到服务端的.NET配置,不会抛出空引用异常
内容的提问来源于stack exchange,提问作者DieGrysWolf
相关产品推荐
相关产品推荐

