如何解决带有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 举报,一经查实,本站将立刻删除。