在Azure Functions中使用FluentEmail 2.8.0遇RazorLight异常求助
解决方案:Azure Functions + FluentEmail 2.8.0 元数据引用加载错误
我之前在.NET Core 3.1的Azure Functions v3项目里集成FluentEmail 2.x的时候也踩过这个坑,当时折腾了好一阵才解决,给你几个可行的方向试试:
1. 检查是否开启了程序集裁剪
如果你的csproj里配置了<PublishTrimmed>true</PublishTrimmed>,这大概率是问题根源!这个选项会在发布时自动裁剪它判定为“无用”的程序集,但RazorLight编译视图需要的元数据引用会被误删。
你需要把这个配置改成<PublishTrimmed>false</PublishTrimmed>,或者直接删除这个配置项。
2. 手动给RazorLight指定程序集引用
Azure Functions的沙盒环境和本地开发环境的程序集加载路径有差异,RazorLight默认从入口程序集加载元数据会失败。你可以在初始化FluentEmail时手动添加必要的程序集引用:
// 初始化RazorLight引擎 var razorEngine = new RazorLightEngineBuilder() .UseFileSystemProject(Path.Combine(Environment.CurrentDirectory, "EmailTemplates")) // 替换成你的视图路径 .UseMemoryCachingProvider() .AddAssemblyReference(typeof(YourFunctionEntryClass).Assembly) // 添加入口函数程序集 .AddAssemblyReference(typeof(FluentEmail.Core.Email).Assembly) // 添加FluentEmail核心程序集 .Build(); // 设置FluentEmail默认渲染器 Email.DefaultRenderer = new RazorRenderer(razorEngine);
3. 改用嵌入式视图资源
把Razor视图文件设置为嵌入式资源,彻底绕开文件系统和运行时编译的元数据问题:
第一步:配置视图为嵌入式资源
在csproj里添加以下配置,把你的视图文件标记为嵌入式资源:
<ItemGroup> <EmbeddedResource Include="EmailTemplates\**\*.cshtml" /> </ItemGroup>
第二步:初始化嵌入式资源的RazorLight引擎
var razorEngine = new RazorLightEngineBuilder() .UseEmbeddedResourcesProject(typeof(YourFunctionEntryClass).Assembly, "YourProjectNamespace.EmailTemplates") // 替换成你的项目命名空间 + 视图文件夹路径 .UseMemoryCachingProvider() .Build(); Email.DefaultRenderer = new RazorRenderer(razorEngine);
4. 确认Azure运行时配置
如果本地开发正常但发布到Azure后出问题,去Azure Portal检查你的Function App配置:
- 进入“配置” -> “常规设置”
- 确认运行时堆栈选择
.NET,版本为.NET Core 3.1
我当时是结合方案2和3解决的问题,你可以逐个尝试,应该能搞定这个RazorLight的元数据加载异常。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

