微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有Sdk.Web Razor模板的.NET Core 3.1 Sdk.Worker? Sdk.Web在做什么以允许使用Razor模板?

如何解决带有Sdk.Web Razor模板的.NET Core 3.1 Sdk.Worker? Sdk.Web在做什么以允许使用Razor模板?

我试图以该示例显示如何将Razor模板呈现为字符串,以便可以将其用于丰富的电子邮件模板。

https://github.com/aspnet/Entropy/tree/master/samples/Mvc.RenderViewToString

我已根据此存储库更新了代码,该代码描述了如何将示例更新到.NET Core 3.1

https://github.com/scottsauber/RazorHtmlEmails

由于我正在尝试使用BackgroundService Worker以便根据数据库更改执行渲染和传输,因此我对其进行了少许更改。

根据此问题(Can a Worker Service be called and/or used inside an existing ASPNET.Core web project?)的答案,可以同时运行多个进程。所以我像这样设置了hostbuilder。

public static IHostBuilder CreateHostBuilder(string[] args)
{
    return Host.CreateDefaultBuilder(args)
        .UseWindowsService()
        .ConfigureServices((hostContext,services) =>
        {
            services.AddDbContext<MyDataContext>(dbOptions =>
            {
                dbOptions.UsesqlServer(
                    hostContext.Configuration.GetConnectionString("db"),sqlOptions => sqlOptions.EnableRetryOnFailure()
                );
            });
            // This is our main worker that will loop
            services.AddHostedService<Worker>();
            // Add NLog as the logging handler
            services.AddLogging(loggingBuilder =>
            {
                loggingBuilder.ClearProviders();
                loggingBuilder.SetMinimumLevel(LogLevel.Trace);
                loggingBuilder.AddNLog(hostContext.Configuration);
            });
        })
        // Add our template renderer
        .ConfigureWebHostDefaults(builder =>
        {
            builder.UseStartup<RazorStartup>();
        });
}

和我的RazorBuilder一样。.

public void ConfigureServices(IServiceCollection services)
        {
            services.AddTransient<IRazorViewToStringRenderer,RazorViewToStringRenderer>();
            services.AddRazorPages();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app,IWebHostEnvironment env)
        {
            var factory = app.applicationservices.GetService<IServiceScopeFactory>();
            using (var scope = factory.CreateScope())
            {
                var confirmAccountModel = new ConfirmAccountEmailviewmodel($"NOOOOO");
                var service = scope.ServiceProvider.GetService<IRazorViewToStringRenderer>();
                var result = service.RenderViewToStringAsync("/Views/Emails/ConfirmAccount/ConfirmAccountEmail.cshtml",confirmAccountModel).Result;
                Console.WriteLine(result);
            }

        }

这就是全部。...“有效” ... 只要我将目标SDK从 <Project Sdk="Microsoft.NET.Sdk.Worker">更改为<Project Sdk="Microsoft.NET.Sdk.Web">

但是当我这样做时,我为工作人员使用的ILogger失去了写入控制台的能力。显然Sdk.Worker正在做一些设置,而Sdk.Web没有做。

当我使用Sdk.Worker时,出现无法找到视图的错误。这意味着Sdk.Web显然在做Sdk.Worker没有的事情。

System.AggregateException
  HResult=0x80131500
  Message=One or more errors occurred. (Unable to find view '/Views/Emails/ConfirmAccount/ConfirmAccountEmail.cshtml'. The following locations were searched:
/Views/Emails/ConfirmAccount/ConfirmAccountEmail.cshtml)
  Source=System.Private.CoreLib
  StackTrace:
   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
   at System.Threading.Tasks.Task`1.get_Result()
   at CompounDalertProcessor.RazorStartup.Configure(IApplicationBuilder app,IWebHostEnvironment env) in C:\Users\c.rice\Documents\Solutions\GIT\CompounDalertProcessor\CompounDalertProcessor\RazorStartup.cs:line 46
   at System.RuntimeMethodHandle.InvokeMethod(Object target,Object[] arguments,Signature sig,Boolean constructor,Boolean wrapExceptions)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object[] parameters,CultureInfo culture)
   at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance,IApplicationBuilder builder)
   at Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__displayClass4_0.<Build>b__0(IApplicationBuilder builder)
   at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__displayClass13_0.<UseStartup>b__2(IApplicationBuilder app)
   at Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.<>c__displayClass0_0.<Configure>g__MiddlewareFilterBuilder|0(IApplicationBuilder builder)
   at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__displayClass0_0.<Configure>b__0(IApplicationBuilder app)
   at Microsoft.AspNetCore.Hosting.GenericWebHostService.<StartAsync>d__31.MoveNext()

  This exception was originally thrown at this call stack:
    CompounDalertProcessor.Razor.Services.RazorViewToStringRenderer.FindView(Microsoft.AspNetCore.Mvc.ActionContext,string) in RazorViewToStringRenderer.cs
    CompounDalertProcessor.Razor.Services.RazorViewToStringRenderer.RenderViewToStringAsync<TModel>(string,TModel) in RazorViewToStringRenderer.cs

Inner Exception 1:
InvalidOperationException: Unable to find view '/Views/Emails/ConfirmAccount/ConfirmAccountEmail.cshtml'. The following locations were searched:
/Views/Emails/ConfirmAccount/ConfirmAccountEmail.cshtml

我一直在研究软件包和设置,试图弄清楚Sdk.Web在做什么,而Sdk.Worker在做什么,但我不知道。我知道SDK会在后台加载和协调很多事情,以使您所需的结果更容易实现,但是我找不到一件事说明它实际上在做什么。 / p>

我担心尝试使用基数为Sdk.Web的工作程序会带来其他变化,而这些变化我现在无法预见。这样使用安全吗?我有什么办法可以只从Sdk.Web中取出需要的物品,然后将它们注入Sdk.Worker中?

我应该放弃使用完整的Razor,而是尝试使用RazorLite之类的Razor email templates in .net standard 2.1 / Core 3.1吗?我一直对那些多年未更新的项目保持警惕。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。