Please forgive me this probably stupid question, I am still not too familiar with the ASP.NET architecture in general.
I inherited a large project, and I intend to setup hangfire.io. I understand that I have to somehow initialize the DB context, but I do not want to hardcode it as suggested by the hangfire-docu.
My APIGlobal.asax.cs currently looks as follows, the interesting stuff begins after // Hangfire stuff:
using System.Web.Http;
using System.Web.Http.ExceptionHandling;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Hangfire;
namespace API
{
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
log4net.Config.XmlConfigurator.Configure();
GlobalConfiguration.Configuration.Services.Add(typeof(IExceptionLogger), new GlobalExceptionLogger());
GlobalConfiguration.Configuration.Services.Replace(typeof(IExceptionHandler), new GlobalExceptionHandler());
MvcHandler.DisableMvcResponseHeader = true;
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
MapperConfig.RegisterMapper();
// Hangfire stuff
GlobalConfiguration.Configuration.UseSqlServerStorage("HardcodedContextString");
RecurringJob.AddOrUpdate("some-id", () => Console.WriteLine("My hangfire test."), "*/2 * * * 1-5");
}
}
}
My database context myContext seems to defined inside APIconnections.config which contains the following lines:
<?xml version="1.0"?>
<connectionStrings>
<add name="myContext" connectionString="Data Source=localhostsqlexpress;Initial Catalog=myContext;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
</connectionStrings>
What shall I put instead of HardcodedContextString to make ASP.NET read the connection string from the respective configuration file?
PS: Interestingly, both lines underneath // Hangfire stuff is underlined in red. What do I miss?
References
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
- Make sure that
Hangfireis actually installed (see also Hangfire Installation Guide). For Visual Studio Professional 2017, you can do the following:- Right-click on your project and click
Manage NuGet Packages. - Select Packet source:
nuget.orgon the right, search forHangfireusing the search bar on the top left. - Select
Hangfireand click Install. You might have to click on Accept when a popup-window appears.
- Right-click on your project and click
- Add
using System.Configuration;in the header ofGlobal.asax.cs. All following steps will happen within that file. - Define a variable which obtains the data base context definition from
connections.config:
string connString = ConfigurationManager.ConnectionStrings["ConStringName"].ToString();
- If you are using
System.Web.Httplike me, you have to replace all appearances ofGlobalConfiguration.xxxwithSystem.Web.Http.GlobalConfiguration.xxx. This is necessary to avoid a conflict since both packages have a (different)GlobalConfigurationproperty. - We also have to specify the full namespace for Hangfire. We will also use
connStringnow: Instead ofGlobalConfiguration.Configuration.UseSqlServerStorage("HardcodedContextString");we
have to write
Hangfire.GlobalConfiguration.Configuration.UseSqlServerStorage(connString);
- Everything should now compile without errors.
PS: From https://stackoverflow.com/a/6134384/1236044 I learned how to obtain the connection string from the config file– thanks @jbl for pointing me to that. JBL also gave me the hint about the name space conflict.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0