Как настроить Hangfire с помощью ASP.NET для получения строки подключения из файла конфигурации?

Пожалуйста, простите меня за, наверное, глупый вопрос, я все еще не слишком хорошо знаком с архитектурой ASP.NET в целом.

Я унаследовал большой проект и намереваюсь настроить hangfire.io. Я понимаю, что мне нужно каким-то образом инициализировать контекст БД, но я не хочу жестко его кодировать, как это предлагается в документе Hangfire.

Мой API\Global.asax.cs сейчас выглядит следующим образом, интересное начинается после // 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"); 
       }
   }
}

Контекст моей базы данных myContext, кажется, определен внутри API\connections.config, который содержит следующие строки:

<?xml version="1.0"?>
  <connectionStrings>
    <add name="myContext" connectionString="Data Source=localhost\sqlexpress;Initial Catalog=myContext;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
  </connectionStrings>

Что мне поставить вместо HardcodedContextString, чтобы ASP.NET считал строку подключения из соответствующего файла конфигурации?

PS: Интересно, что обе строки под // Hangfire stuff подчеркнуты красным. Что я скучаю?

использованная литература


person B--rian    schedule 14.01.2020    source источник
comment
stackoverflow.com/a/6134384/1236044 при условии, что ваш файл connections.config включен в ваш web.config Что касается красного подчеркивания это потому, что существует конфликт в GlobalConfiguration, который существует как в System.Web.Http, так и в Hangfire. Использование правильного полного пространства имен при использовании GlobalConfiguration должно решить эту проблему.   -  person jbl    schedule 14.01.2020
comment
@jbl И прав ли я в своем предположении, что connections.config содержит мой контекст БД? Мне интересно, так как я не вижу строки подключения, аналогичной той, что в документе.   -  person B--rian    schedule 14.01.2020
comment
Нет, connections.config именно то, что кажется: файл конфигурации, содержащий строку подключения. Эта строка подключения, скорее всего, будет использоваться для создания вашего DbContext   -  person jbl    schedule 15.01.2020


Ответы (1)


  1. Make sure that Hangfire is actually installed (see also Hangfire Installation Guide). For Visual Studio Professional 2017, you can do the following:
    1. Right-click on your project and click Manage NuGet Packages.
    2. Выберите Источник пакета: nuget.org справа, найдите Hangfire с помощью панели поиска в левом верхнем углу.
    3. Выберите Hangfire и нажмите Установить. Возможно, вам придется нажать Принять, когда появится всплывающее окно.
  2. Добавьте using System.Configuration; в шапку Global.asax.cs. Все последующие шаги будут происходить в этом файле.
  3. Определите переменную, которая получает определение контекста базы данных из connections.config:
string connString = ConfigurationManager.ConnectionStrings["ConStringName"].ToString();
  1. Если вы используете System.Web.Http, как я, вам нужно заменить все появления GlobalConfiguration.xxx на System.Web.Http.GlobalConfiguration.xxx. Это необходимо, чтобы избежать конфликта, поскольку оба пакета имеют (разное) свойство GlobalConfiguration.
  2. Мы также должны указать полное пространство имен для Hangfire. Теперь мы также будем использовать connString: вместо GlobalConfiguration.Configuration.UseSqlServerStorage("HardcodedContextString"); мы должны написать
Hangfire.GlobalConfiguration.Configuration.UseSqlServerStorage(connString);
  1. Теперь все должно скомпилироваться без ошибок.

PS: Из https://stackoverflow.com/a/6134384/1236044 я узнал, как чтобы получить строку подключения из файла конфигурации - спасибо @ jbl за то, что указал мне на это. JBL также намекнул на конфликт пространств имен.

person B--rian    schedule 15.01.2020