Net Core отправляет фоновую службу электронной почты с помощью Postal и Hangfire

#c# #asp.net-core #hangfire #postal

#c# #asp.net-core #hangfire #postal

Вопрос:

Я пытаюсь отправлять электронные письма с помощью Hangfire и Postal, но у меня возникают проблемы с HttpContext. Если я выполняю съемку через контроллер, отправка выполняется без проблем, теперь, если я выполняю задание через Hangfire, генерируется ожидание.

Запуск кода.cs

 public void ConfigureServices(IServiceCollection services)
{
    services.AddHangfire(configuration => configuration
        .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
        .UseSimpleAssemblyNameTypeSerializer()
        .UseRecommendedSerializerSettings()
        .UseSqlServerStorage(Configuration.GetConnectionString("default"), new SqlServerStorageOptions
        {
            CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
            SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
            QueuePollInterval = TimeSpan.Zero,
            UseRecommendedIsolationLevel = true,
            UsePageLocksOnDequeue = true,
            DisableGlobalLocks = true
        }));

    services.Configure<EmailSenderOptions>(Configuration.GetSection("EmailSender"));
    services.AddPostal();
    services.AddTransient<IEmailSenderEnhance, EmailSender>();
    services.AddHttpContextAccessor();
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    var options = new DashboardOptions
    {
        Authorization = new[] { new HangFireAuthorizationFilter() }
    };

    app.UseHangfireDashboard("/hangfire", options);
    app.UseHangfireServer();

    RecurringJob.AddOrUpdate<NotificationServices>("SendNotify-", m => m.Notify(1), Cron.Daily);
}
  

Code NotificationServices.cs

 public class NotificationServices
{
    private readonly IEmailSenderEnhance _emailSender;
    private readonly Config _appConfig;
    private readonly IHttpContextAccessor _httpContextAccessor;

    public NotificationServices(IEmailSenderEnhance emailSender, IOptions<Config> optionsAccessor, IHttpContextAccessor httpContextAccessor)
    {
        _emailSender = emailSender;
        if (optionsAccessor == null) throw new ArgumentNullException(nameof(optionsAccessor));
        _appConfig = optionsAccessor.Value;
        _httpContextAccessor = httpContextAccessor;
    }


    public void Notify(int messageId)
    {
        var listOSs = Task.Run(async () => await this.SendEmail(messageId));
    }

    public async Task SendEmail(int orderID)
    {
        var orderRy = new OrderRepository();
        var order = orderRy.Get_By_ID(orderID);

        try
        {
            var requestPath = new Postal.RequestPath
            {
                PathBase = _httpContextAccessor.HttpContext.Request.PathBase.ToString(),
                Host = _httpContextAccessor.HttpContext.Request.Host.ToString(),
                IsHttps = _httpContextAccessor.HttpContext.Request.IsHttps,
                Scheme = _httpContextAccessor.HttpContext.Request.Scheme,
                Method = _httpContextAccessor.HttpContext.Request.Method
            };

            var emailData = new Postal.Email("SendTest")
            {
                RequestPath = requestPath,
            };

            var emailsCopy = $"{order.Salesman.Email},{order.Salesman2.Email},";

            emailData.ViewData["to"] = emailsCopy;
            emailData.ViewData["Order"] = order;

            await _emailSender.SendEmailAsync(emailData);
        }
        catch (Exception ex)
        {
            
        }
    }
}
  

Ошибка находится в HttpContext:
_httpContextAccessor.HttpContext.Request.База путей.toString()

Можно ли отправлять электронные письма в фоновом режиме с помощью Postal?

Комментарии:

1. Можете ли вы сообщить нам подробное сообщение об ошибке? Вы имеете в виду, что вы не можете получить путь запроса или запрос. База пути равна нулю? Насколько я знаю, HttpContext не является потокобезопасным. Чтение или запись свойств HttpContext вне обработки запроса может привести к исключению NullReferenceException. Итак, вы могли бы попытаться перенести эти свойства (ParthBase, Host и т. Д.) В метод SendEmail, Вместо того, Чтобы получать их из HttpContext .

2. @ZhiLv сообщение об ошибке: ссылка на объект не установлена для экземпляра объекта. Я изменил свой код Postal.RequestPath, и теперь это ошибка сообщения: не удалось отобразить шаблон из-за сбоя razor engine. Насколько я понимаю, невозможно найти путь к представлению razor, необходимо ли указывать абсолютный путь представления?