ASP.NET Core MVC运行Unity WebGL文件报Unexpected token '<'如何解决
根因分析
这个报错的本质是浏览器请求Unity WebGL生成的.js、.wasm、.data等资源时,ASP.NET Core服务端没有返回对应静态文件,反而返回了HTML格式的错误页面(通常是404页面),浏览器尝试将HTML内容作为JS代码解析时,就会触发Unexpected token '<'语法错误。Unity本地build and run正常是因为Unity自带的Web服务器已经默认配置好了WebGL相关的资源规则。
解决方案
- 配置ASP.NET Core静态文件的MIME类型映射
ASP.NET Core默认没有注册WebGL相关后缀的MIME类型,需要修改启动文件配置,.NET 6+版本修改Program.cs如下:
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); // 配置WebGL专属MIME类型 var contentTypeProvider = new FileExtensionContentTypeProvider(); // 基础WebGL资源类型 contentTypeProvider.Mappings[".data"] = "application/octet-stream"; contentTypeProvider.Mappings[".wasm"] = "application/wasm"; contentTypeProvider.Mappings[".symbols.json"] = "application/json"; // 若开启了gzip压缩需添加以下类型 contentTypeProvider.Mappings[".data.gz"] = "application/octet-stream"; contentTypeProvider.Mappings[".wasm.gz"] = "application/wasm"; contentTypeProvider.Mappings[".js.gz"] = "application/javascript"; // 若开启了Brotli压缩需添加以下类型 contentTypeProvider.Mappings[".data.br"] = "application/octet-stream"; contentTypeProvider.Mappings[".wasm.br"] = "application/wasm"; contentTypeProvider.Mappings[".js.br"] = "application/javascript"; // 应用自定义配置启用静态文件服务 app.UseStaticFiles(new StaticFileOptions { ContentTypeProvider = contentTypeProvider, // 压缩资源需额外配置响应头告知浏览器解压规则 OnPrepareResponse = ctx => { if (ctx.File.Name.EndsWith(".gz")) { ctx.Context.Response.Headers.ContentEncoding = "gzip"; } else if (ctx.File.Name.EndsWith(".br")) { ctx.Context.Response.Headers.ContentEncoding = "br"; } } }); // 保留原有其他中间件配置,注意静态文件服务必须放在路由、MVC中间件之前 app.UseRouting(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();
- 校验Unity构建产物的存放路径
将Unity WebGL构建生成的所有文件(包含Build、TemplateData文件夹、index.html)完整放入ASP.NET Core项目的wwwroot目录下。如果将游戏内嵌到MVC视图中,需要保证视图内的资源引用路径和wwwroot下的文件结构完全匹配,例如产物放在wwwroot/MyWebGLGame目录下,js引用路径需对应修改为/MyWebGLGame/Build/xxxx.js。 - 调整路由优先级避免资源请求被拦截
确保UseStaticFiles中间件注册顺序在路由、MVC、SPA回退等中间件之前,避免WebGL的资源请求被业务路由拦截返回HTML错误页。 - 精准排查错误
若完成上述配置后仍报错,打开浏览器开发者工具的「网络」面板,找到触发报错的JS资源请求,查看返回内容与状态码,根据具体的404/500状态码进一步排查路径、权限相关问题。
内容的提问来源于stack exchange,提问作者ColdCoffeeDev
相关产品推荐
相关产品推荐

