Net Core send email background service with Postal and Hangfire

821 views Asked by At

I'm trying to send emails using Hangfire and Postal, but I'm having problems with the HTTPContext. If I execute the shooting through a controller the sending is done without problems, now if I execute a job via Hangfire an expection is generated.

Code startup.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)
        {
            
        }
    }
}

The error is in HttpContext: _httpContextAccessor.HttpContext.Request.PathBase.ToString()

Is it possible to send e-mails via background with Postal?

0

There are 0 answers