问题
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 API\Global.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 API\connections.config
which contains the following lines:
<?xml version="1.0"?>
<connectionStrings>
<add name="myContext" connectionString="Data Source=localhost\sqlexpress;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
- How do I set up 'connectionString' for a mySQL database for Hangfire?
回答1:
- Make sure that
Hangfire
is 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.org
on the right, search forHangfire
using the search bar on the top left. - Select
Hangfire
and 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.Http
like me, you have to replace all appearances ofGlobalConfiguration.xxx
withSystem.Web.Http.GlobalConfiguration.xxx
. This is necessary to avoid a conflict since both packages have a (different)GlobalConfiguration
property. - We also have to specify the full namespace for Hangfire. We will also use
connString
now: 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.
来源:https://stackoverflow.com/questions/59736118/how-to-configure-hangfire-with-asp-net-to-obtain-connection-string-from-config-f