You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

2023年如何将ASP.NET MVC Razor视图渲染为字符串?加载类型错误求助

Razor编译视图为字符串时加载WindowsImpersonationContext失败的解决办法

你尝试通过RazorEngine将视图编译为字符串用于邮件内容,使用代码:

string body = Engine.Razor.RunCompile(template,"templateKey",null,model);

出现错误:

无法加载类型'System.Security.Principal.WindowsImpersonationContext

以下是几种解决思路:

  • 版本兼容性检查
    该错误大概率是RazorEngine版本与当前项目的.NET框架不匹配导致的。如果你使用的是.NET Core/.NET 5+,部分旧版RazorEngine依赖.NET Framework专属类型,会引发加载失败。建议更换为适配当前框架的RazorEngine版本,或直接改用ASP.NET Core原生的Razor视图渲染能力。

  • 改用ASP.NET Core原生视图渲染
    对于ASP.NET Core项目,无需依赖第三方库,直接使用框架自带的IRazorViewEngine即可稳定渲染视图为字符串。示例代码如下:

    private readonly IRazorViewEngine _razorViewEngine;
    private readonly ITempDataProvider _tempDataProvider;
    private readonly IServiceProvider _serviceProvider;
    
    public YourService(IRazorViewEngine razorViewEngine, ITempDataProvider tempDataProvider, IServiceProvider serviceProvider)
    {
        _razorViewEngine = razorViewEngine;
        _tempDataProvider = tempDataProvider;
        _serviceProvider = serviceProvider;
    }
    
    public async Task<string> RenderViewToStringAsync(string viewName, object model)
    {
        var httpContext = new DefaultHttpContext { RequestServices = _serviceProvider };
        var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
    
        using var sw = new StringWriter();
        var viewResult = _razorViewEngine.FindView(actionContext, viewName, false);
    
        if (!viewResult.Success)
        {
            throw new InvalidOperationException($"找不到指定视图: {viewName}");
        }
    
        var viewData = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary())
        {
            Model = model
        };
    
        var viewContext = new ViewContext(
            actionContext,
            viewResult.View,
            viewData,
            new TempDataDictionary(httpContext, _tempDataProvider),
            sw,
            new HtmlHelperOptions()
        );
    
        await viewResult.View.RenderAsync(viewContext);
        return sw.ToString();
    }
    
  • 调整RazorEngine配置(若坚持使用)
    如果你需要继续使用RazorEngine,可通过初始化配置规避兼容性问题:

    var config = new TemplateServiceConfiguration
    {
        Language = Language.CSharp,
        CompilerServiceFactory = new RoslynCompilerServiceFactory()
    };
    Engine.Razor = RazorEngineService.Create(config);
    

    同时确保项目已安装System.Security.Principal.Windows NuGet包(针对.NET Core项目)。

内容的提问来源于stack exchange,提问作者Vlad Pirvan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 01:15:30