Azure App Service中ASP.NET Core 5访问.cshtml文件出现路径错误
解决ASP.NET Core 5本地与Azure App Service统一获取邮件模板路径的问题
问题根源
从报错路径能明确问题所在:
找不到路径的一部分: '/home/site/wwwroot/wwwroot/Templates/Email/EmailRegistroAssinatura.cshtml'
你手动拼接了wwwroot/...,但本地与Azure环境中ContentRootPath指向的目录存在差异:
- 本地开发时,
ContentRootPath指向项目根目录,此时wwwroot是项目下的子目录,拼接后路径正常 - 部署到Azure后,
ContentRootPath直接指向**wwwroot目录**(Azure App Service默认将发布的wwwroot设为内容根目录),再拼接wwwroot就导致路径重复。
正确解决方案
改用IWebHostEnvironment的**WebRootPath属性**,它专门用于定位wwwroot目录,在两种环境下都会自动指向正确路径:
using Microsoft.AspNetCore.Hosting; using System.IO; // 直接获取wwwroot的根路径 string webRootPath = _hostingEnvironment.WebRootPath; // 用Path.Combine拼接所有路径段,避免跨平台分隔符问题 string filePath = Path.Combine("Templates", "Email", $"{fileName}.cshtml"); string fullPath = Path.Combine(webRootPath, filePath); using (StreamReader reader = File.OpenText(fullPath)) { htmlStringEmail = reader.ReadToEnd(); }
额外优化提示
- 始终用
Path.Combine拼接路径,避免手动拼接字符串带来的跨平台路径分隔符问题(Windows用\,Linux/Azure用/) - 如果模板文件不需要对外访问,可将其放在
wwwroot外的目录(比如项目根目录下的Templates文件夹),此时仍用ContentRootPath,但要确保发布时该目录被包含:在项目的.csproj文件中添加以下配置:<ItemGroup> <Content Include="Templates/**/*" CopyToOutputDirectory="PreserveNewest" /> </ItemGroup>
内容的提问来源于stack exchange,提问作者Victor Moraes
相关产品推荐
相关产品推荐

