Commit 80c9a39c52b283570beeee3a1e6c0af7233f302f

Authored by Schwirg László
1 parent 2352c68d

- Hangfire segítségével megoldásra került, hogy az ütemezett riportokat a web alkalmazás futtatja,

tehát nem kell a service hozzá;
- ez a funkció az xml paraméterek között ki/be kapcsolható;
- értelemszerűen, ha ki van kapcsolva, akkor a szervizt kell a megfelelő módon használni!
- a webalkalmazás automatikus indítása és folyamatos futtatása is beépítésre került
Vrh.Web.Reporting/Global.asax.cs
... ... @@ -15,14 +15,16 @@ using Hangfire;
15 15 using Microsoft.Web.Administration;
16 16 using Vrh.iScheduler;
17 17 using Vrh.Logger;
18   -
  18 +using Vrh.Web.HangfireBootstrapperNS;
19 19 namespace Vrh.Web.Reporting
20 20 {
21 21 public class MvcApplication : System.Web.HttpApplication
22 22 {
23 23 protected void Application_Start()
24 24 {
25   - (new DCLogEntry(LogLevel.Information, "Vrh.Web.Reporting.MvcApplication.Application_Start")).Write();
  25 + var methodfullname = $"{typeof(HangfireBootstrapper).FullName}.{System.Reflection.MethodBase.GetCurrentMethod().Name}";
  26 +
  27 + (new DCLogEntry(LogLevel.Information, methodfullname)).Write();
26 28 AreaRegistration.RegisterAllAreas();
27 29 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
28 30 RouteConfig.RegisterRoutes(RouteTable.Routes);
... ... @@ -51,7 +53,7 @@ namespace Vrh.Web.Reporting
51 53 /// Here NameOfTheAssemblyContainingTheAutostartProviderClass is the name of (for example the dll), but without the extension.
52 54 //////////////////////////////////////////////////////////////////////////////////////
53 55  
54   - (new ApplicationPreload())._Preload();
  56 + (new HangfireBootstrapper()).Initialize();
55 57  
56 58 //Vrh.Web.Menu inicializáló beállításai
57 59 Vrh.Web.Menu.Global.CustomerLogo = "~/Content/Images/Menu_LearLogo.jpg";
... ... @@ -63,7 +65,8 @@ namespace Vrh.Web.Reporting
63 65  
64 66 protected void Application_End(object sender, EventArgs e)
65 67 {
66   - (new DCLogEntry(LogLevel.Information, "Vrh.Web.Reporting.MvcApplication.Application_End")).Write();
  68 + var methodfullname = $"{typeof(HangfireBootstrapper).FullName}.{System.Reflection.MethodBase.GetCurrentMethod().Name}";
  69 + (new DCLogEntry(LogLevel.Information, methodfullname)).Write();
67 70 HangfireBootstrapper.Instance.Stop();
68 71 }
69 72 /// <summary>
... ... @@ -77,199 +80,4 @@ namespace Vrh.Web.Reporting
77 80 //int i = 1;
78 81 }
79 82 }
80   - public class ApplicationPreload : System.Web.Hosting.IProcessHostPreloadClient
81   - {
82   - public void Preload(string[] parameters)
83   - {
84   - (new DCLogEntry(LogLevel.Information, "Vrh.Web.Reporting.ApplicationPreload")).Write();
85   - _Preload();
86   - }
87   - public void _Preload()
88   - {
89   - SetupAutoStart(typeof(ApplicationPreload));
90   - HangfireBootstrapper.Instance.SqlDBconnectionstring = Vrh.XmlProcessing.ConnectionStringStore.GetSQL(HANGFIRESQLDBCONNECTIONSTRINGNAME);
91   - HangfireBootstrapper.Instance.Start();
92   - Vrh.iScheduler.Monitor.InitHangfire(HangfireBootstrapper.Instance._backgroundJobServer);
93   - }
94   -
95   - public const string HANGFIRESQLDBCONNECTIONSTRINGNAME = "MAINDBLOG4PRO";
96   - public const string CONFIGFILEDIRECTORY = @"inetsrv\config";
97   - public const string CONFIGFILENAME = @"applicationHost.config";
98   - //public const string FILEPATH = @"C:\temp\applicationHost.config";
99   - public const string POOLNAME = "Log4ProIS_REPORTING";
100   - public const string WEBAPPNAME = "/Log4ProIS-REPORTING";
101   - public const string WEBSITENAME = "Default Web Site";
102   - public const string AUTOSTARTPROVIDERNAME = "ApplicationPreload";
103   - public const string AUTOSTARTPROVIDERTYPENAME = "Vrh.Web.Reporting.ApplicationPreload";
104   - public const string AUTOSTARTPROVIDERASSEMBLYNAME = "Vrh.Web.Reporting";
105   -
106   - public static bool SetupAutoStart(Type serviceAutoStartProviderType)
107   - {
108   - const string SYSTEMAPPLICATIONHOST_ELEMENT = "system.applicationHost";
109   - const string APPLICATIONPOOLS_ELEMENT = "applicationPools";
110   - const string SITES_ELEMENT = "sites";
111   - const string SERVICEAUTOSTARTPROVIDERS_ELEMENT = "serviceAutoStartProviders";
112   - const string SITE_ELEMENT = "site";
113   - const string APPLICATION_ELEMENT = "application";
114   - const string ADD_ELEMENT = "add";
115   - const string NAME_ATTRIBUTE = "name";
116   - const string TYPE_ATTRIBUTE = "type";
117   - const string SERVICEAUTOSTARTENABLED_ATTRIBUTE = "serviceAutoStartEnabled";
118   - const string SERVICEAUTOSTARTPROVIDER_ATTRIBUTE = "serviceAutoStartProvider";
119   - const string APPLICATIONPOOL_ATTRIBUTE = "applicationPool";
120   - const string PATH_ATTRIBUTE = "path";
121   - const string AUTOSTART_ATTRIBUTE = "autoStart";
122   - const string STARTMODE_ATTRIBUTE = "startMode";
123   -
124   - string applicationpoolname = GetCurrentApplicationPoolName();
125   - string websitename = System.Web.Hosting.HostingEnvironment.SiteName;
126   - string webapplicationname = System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath;
127   - string autostartprovidername = (websitename + "____" + applicationpoolname + "____" + webapplicationname).Replace(" ", "_").Replace("-", "_").Replace("/", "_");
128   - string serviceAutoStartProviderTypeFullName = serviceAutoStartProviderType.FullName;
129   - string serviceAutoStartProviderAssassemblyName = serviceAutoStartProviderType.Assembly.GetName().Name;
130   - var le = new DCLogEntry(LogLevel.Information, "Vrh.Web.Reporting.MvcApplication.SetupAutoStart");
131   - try
132   - {
133   - string configfilepath = Path.Combine(NativeSystemPath, CONFIGFILEDIRECTORY, CONFIGFILENAME);
134   - le.AddDataField("configfilepath", configfilepath);
135   - le.AddDataField("applicationpoolname", applicationpoolname);
136   - le.AddDataField("websitename", websitename);
137   - le.AddDataField("webapplicationname", webapplicationname);
138   - le.AddDataField("serviceAutoStartProviderTypeFullName", serviceAutoStartProviderTypeFullName);
139   - le.AddDataField("serviceAutoStartProviderAssassemblyName", serviceAutoStartProviderAssassemblyName);
140   -
141   -
142   - var filecontent = System.IO.File.ReadAllText(configfilepath);
143   - XElement configxml = XElement.Parse(filecontent, LoadOptions.PreserveWhitespace); //XElement.Load(configfilepath);
144   -
145   - XElement myconfigrootxml = configxml.Element(XName.Get(SYSTEMAPPLICATIONHOST_ELEMENT));
146   - XElement myapplicationpooladdelement = myconfigrootxml?.Element(XName.Get(APPLICATIONPOOLS_ELEMENT))?
147   - .Elements(XName.Get(ADD_ELEMENT))?.FirstOrDefault(e => e.Attribute(XName.Get(NAME_ATTRIBUTE)).Value == applicationpoolname);
148   - XElement mysiteapplicationelement = myconfigrootxml?.Element(XName.Get(SITES_ELEMENT))?
149   - .Elements(XName.Get(SITE_ELEMENT))?.FirstOrDefault(e => e.Attribute(XName.Get(NAME_ATTRIBUTE)).Value == websitename)
150   - .Elements(XName.Get(APPLICATION_ELEMENT))?.FirstOrDefault(e => e.Attribute(XName.Get(PATH_ATTRIBUTE)).Value == webapplicationname && e.Attribute(XName.Get(APPLICATIONPOOL_ATTRIBUTE)).Value == applicationpoolname);
151   - if (myapplicationpooladdelement == null) return false;
152   - if (mysiteapplicationelement == null) return false;
153   -
154   - bool configchanged = false;
155   - configchanged = SetOrAddAttribute(AUTOSTART_ATTRIBUTE, myapplicationpooladdelement, "true") || configchanged;
156   - configchanged = SetOrAddAttribute(STARTMODE_ATTRIBUTE, myapplicationpooladdelement, "AlwaysRunning") || configchanged;
157   - configchanged = SetOrAddAttribute(SERVICEAUTOSTARTENABLED_ATTRIBUTE, mysiteapplicationelement, "true") || configchanged;
158   - configchanged = SetOrAddAttribute(SERVICEAUTOSTARTPROVIDER_ATTRIBUTE, mysiteapplicationelement, autostartprovidername) || configchanged;
159   -
160   - XElement myautostartproviderselement = null;
161   - XElement myautostartprovideraddelement = null;
162   - configchanged = SetOrAddElement(SERVICEAUTOSTARTPROVIDERS_ELEMENT, myconfigrootxml, "", out myautostartproviderselement) || configchanged;
163   - configchanged = SetOrAddElementWithSelectorAttribute(ADD_ELEMENT, myautostartproviderselement, NAME_ATTRIBUTE, autostartprovidername, "", out myautostartprovideraddelement) || configchanged;
164   - configchanged = SetOrAddAttribute(TYPE_ATTRIBUTE, myautostartprovideraddelement, $"{serviceAutoStartProviderTypeFullName},{serviceAutoStartProviderAssassemblyName }") || configchanged;
165   -
166   - if (configchanged)
167   - {
168   - //configxml.Save(configfilepath);
169   - System.IO.File.WriteAllText(configfilepath, configxml.ToString());
170   - }
171   - le.AddDataField("configchanged", configchanged);
172   - //le.AddDataField("myconfigrootxml", myconfigrootxml);
173   - le.AddSuccessResult("SUCCESS");
174   - return true;
175   - }
176   - catch (Exception ex) { le.AddExceptionResult(ex); le.SetLogLevel(LogLevel.Error); return false; }
177   - finally { le.Write(); }
178   - }
179   - private static bool SetOrAddElement(string elementname, XElement elementcontainer, string elementvalue, out XElement myelement)
180   - {
181   - bool configchanged = false;
182   - myelement = elementcontainer?.Element(XName.Get(elementname));
183   - if (myelement == null) { myelement = new XElement(XName.Get(elementname), ""); elementcontainer.Add(myelement); configchanged = true; }
184   - if (myelement.Value != elementvalue) { myelement.Value = elementvalue; configchanged = true; }
185   - return configchanged;
186   - }
187   - private static bool SetOrAddElementWithSelectorAttribute(string elementname, XElement elementcontainer, string selectorattributename, string selectorattributevalue, string elementvalue, out XElement myelement)
188   - {
189   - bool configchanged = false;
190   - myelement = elementcontainer?.Elements(XName.Get(elementname))?.FirstOrDefault(e => e.Attribute(XName.Get(selectorattributename)).Value == selectorattributevalue);
191   - if (myelement == null)
192   - {
193   - myelement = new XElement(XName.Get(elementname), "");
194   - elementcontainer.Add(myelement);
195   - SetOrAddAttribute(selectorattributename, myelement, selectorattributevalue);
196   - configchanged = true;
197   - }
198   - if (myelement.Value != elementvalue) { myelement.Value = elementvalue; configchanged = true; }
199   - return configchanged;
200   - }
201   - private static bool SetOrAddAttribute(string attrname, XElement attrcontainer, string attrvalue)
202   - {
203   - bool configchanged = false;
204   - XAttribute attr = attrcontainer.Attribute(XName.Get(attrname));
205   - if (attr == null) { attr = new XAttribute(XName.Get(attrname), ""); attrcontainer.Add(attr); configchanged = true; }
206   - if (attr.Value != attrvalue) { attr.Value = attrvalue; configchanged = true; }
207   - return configchanged;
208   - }
209   - public static string NativeSystemPath
210   - {
211   - get
212   - {
213   - if (Environment.Is64BitOperatingSystem)
214   - {
215   - return System.IO.Path.Combine(
216   - Environment.GetFolderPath(Environment.SpecialFolder.Windows),
217   - "Sysnative");
218   - }
219   - return Environment.GetFolderPath(Environment.SpecialFolder.System);
220   - }
221   - }
222   -
223   - public static string GetCurrentApplicationPoolName()
224   - {
225   - string appPoolName = string.Empty;
226   - foreach (Application app in (new ServerManager()).Sites[System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName()].Applications)
227   - {
228   - if (app.Path == HttpRuntime.AppDomainAppVirtualPath) { appPoolName = app.ApplicationPoolName; }
229   - }
230   - return appPoolName;
231   - }
232   - }
233   - public class HangfireBootstrapper : IRegisteredObject
234   - {
235   - public static readonly HangfireBootstrapper Instance = new HangfireBootstrapper();
236   - public BackgroundJobServer _backgroundJobServer { get; set; }
237   - public string SqlDBconnectionstring { get; set; } = null;
238   - private readonly object _lockObject = new object();
239   - private bool _started;
240   -
241   -
242   - private HangfireBootstrapper()
243   - {
244   - }
245   -
246   - public void Start()
247   - {
248   - lock (_lockObject)
249   - {
250   - if (_started) return;
251   - _started = true;
252   -
253   - HostingEnvironment.RegisterObject(this);
254   -
255   - GlobalConfiguration.Configuration
256   - .UseSqlServerStorage(SqlDBconnectionstring)
257   - // Specify other options here
258   - ;
259   -
260   - _backgroundJobServer = new BackgroundJobServer();
261   - }
262   - }
263   -
264   - public void Stop()
265   - {
266   - lock (_lockObject)
267   - {
268   - if (_backgroundJobServer != null) { _backgroundJobServer.Dispose(); }
269   - HostingEnvironment.UnregisterObject(this);
270   - }
271   - }
272   -
273   - void IRegisteredObject.Stop(bool immediate) { Stop(); }
274   - }
275 83 }
... ...
Vrh.Web.Reporting/HangfireBootstrapper.cs 0 → 100644
... ... @@ -0,0 +1,217 @@
  1 +using System.Text;
  2 +using System.Threading.Tasks;
  3 +using System;
  4 +using System.Collections.Generic;
  5 +using System.Diagnostics;
  6 +using System.IO;
  7 +using System.Linq;
  8 +using System.Net;
  9 +using System.Threading;
  10 +using System.Web;
  11 +using System.Web.Hosting;
  12 +using System.Web.Mvc;
  13 +using System.Web.Optimization;
  14 +using System.Web.Routing;
  15 +using System.Xml.Linq;
  16 +using Hangfire;
  17 +using Microsoft.Web.Administration;
  18 +using Vrh.Logger;
  19 +
  20 +namespace Vrh.Web.HangfireBootstrapperNS
  21 +{
  22 + public class HangfireBootstrapper : IRegisteredObject, IProcessHostPreloadClient
  23 + {
  24 + public void Preload(string[] parameters)
  25 + {
  26 + var methodfullname = $"{typeof(HangfireBootstrapper).FullName}.{System.Reflection.MethodBase.GetCurrentMethod().Name}";
  27 + (new DCLogEntry(LogLevel.Information, methodfullname)).Write();
  28 + Initialize();
  29 + }
  30 + public void Initialize()
  31 + {
  32 + SetupAutoStart(typeof(HangfireBootstrapper));
  33 + HangfireBootstrapper.Instance.SqlDBconnectionstring = Vrh.XmlProcessing.ConnectionStringStore.GetSQL(HANGFIRESQLDBCONNECTIONSTRINGNAME);
  34 + HangfireBootstrapper.Instance.Start();
  35 + Vrh.iScheduler.Monitor.InitHangfire(HangfireBootstrapper.Instance._backgroundJobServer);
  36 + }
  37 +
  38 + private const string HANGFIRESQLDBCONNECTIONSTRINGNAME = "MAINDBLOG4PRO";
  39 + private const string CONFIGFILEDIRECTORY = @"inetsrv\config";
  40 + private const string CONFIGFILENAME = @"applicationHost.config";
  41 + //public const string FILEPATH = @"C:\temp\applicationHost.config";
  42 + private const string POOLNAME = "Log4ProIS_REPORTING";
  43 + private const string WEBAPPNAME = "/Log4ProIS-REPORTING";
  44 + private const string WEBSITENAME = "Default Web Site";
  45 + private const string AUTOSTARTPROVIDERNAME = "ApplicationPreload";
  46 + private const string AUTOSTARTPROVIDERTYPENAME = "Vrh.Web.Reporting.ApplicationPreload";
  47 + private const string AUTOSTARTPROVIDERASSEMBLYNAME = "Vrh.Web.Reporting";
  48 +
  49 + private static bool SetupAutoStart(Type serviceAutoStartProviderType)
  50 + {
  51 + const string SYSTEMAPPLICATIONHOST_ELEMENT = "system.applicationHost";
  52 + const string APPLICATIONPOOLS_ELEMENT = "applicationPools";
  53 + const string SITES_ELEMENT = "sites";
  54 + const string SERVICEAUTOSTARTPROVIDERS_ELEMENT = "serviceAutoStartProviders";
  55 + const string SITE_ELEMENT = "site";
  56 + const string APPLICATION_ELEMENT = "application";
  57 + const string ADD_ELEMENT = "add";
  58 + const string NAME_ATTRIBUTE = "name";
  59 + const string TYPE_ATTRIBUTE = "type";
  60 + const string SERVICEAUTOSTARTENABLED_ATTRIBUTE = "serviceAutoStartEnabled";
  61 + const string SERVICEAUTOSTARTPROVIDER_ATTRIBUTE = "serviceAutoStartProvider";
  62 + const string APPLICATIONPOOL_ATTRIBUTE = "applicationPool";
  63 + const string PATH_ATTRIBUTE = "path";
  64 + const string AUTOSTART_ATTRIBUTE = "autoStart";
  65 + const string STARTMODE_ATTRIBUTE = "startMode";
  66 +
  67 + string applicationpoolname = GetCurrentApplicationPoolName();
  68 + string websitename = System.Web.Hosting.HostingEnvironment.SiteName;
  69 + string webapplicationname = System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath;
  70 + string autostartprovidername = (websitename + "____" + applicationpoolname + "____" + webapplicationname).Replace(" ", "_").Replace("-", "_").Replace("/", "_");
  71 + string serviceAutoStartProviderTypeFullName = serviceAutoStartProviderType.FullName;
  72 + string serviceAutoStartProviderAssassemblyName = serviceAutoStartProviderType.Assembly.GetName().Name;
  73 + var methodfullname = $"{typeof(HangfireBootstrapper).FullName}.{System.Reflection.MethodBase.GetCurrentMethod().Name}";
  74 + var le = new DCLogEntry(LogLevel.Information, methodfullname);
  75 + try
  76 + {
  77 + string configfilepath = Path.Combine(NativeSystemPath, CONFIGFILEDIRECTORY, CONFIGFILENAME);
  78 + le.AddDataField("configfilepath", configfilepath);
  79 + le.AddDataField("applicationpoolname", applicationpoolname);
  80 + le.AddDataField("websitename", websitename);
  81 + le.AddDataField("webapplicationname", webapplicationname);
  82 + le.AddDataField("serviceAutoStartProviderTypeFullName", serviceAutoStartProviderTypeFullName);
  83 + le.AddDataField("serviceAutoStartProviderAssassemblyName", serviceAutoStartProviderAssassemblyName);
  84 +
  85 +
  86 + var filecontent = System.IO.File.ReadAllText(configfilepath);
  87 + XElement configxml = XElement.Parse(filecontent, LoadOptions.PreserveWhitespace); //XElement.Load(configfilepath);
  88 +
  89 + XElement myconfigrootxml = configxml.Element(XName.Get(SYSTEMAPPLICATIONHOST_ELEMENT));
  90 + XElement myapplicationpooladdelement = myconfigrootxml?.Element(XName.Get(APPLICATIONPOOLS_ELEMENT))?
  91 + .Elements(XName.Get(ADD_ELEMENT))?.FirstOrDefault(e => e.Attribute(XName.Get(NAME_ATTRIBUTE)).Value == applicationpoolname);
  92 + XElement mysiteapplicationelement = myconfigrootxml?.Element(XName.Get(SITES_ELEMENT))?
  93 + .Elements(XName.Get(SITE_ELEMENT))?.FirstOrDefault(e => e.Attribute(XName.Get(NAME_ATTRIBUTE)).Value == websitename)
  94 + .Elements(XName.Get(APPLICATION_ELEMENT))?.FirstOrDefault(e => e.Attribute(XName.Get(PATH_ATTRIBUTE)).Value == webapplicationname && e.Attribute(XName.Get(APPLICATIONPOOL_ATTRIBUTE)).Value == applicationpoolname);
  95 + if (myapplicationpooladdelement == null) return false;
  96 + if (mysiteapplicationelement == null) return false;
  97 +
  98 + bool configchanged = false;
  99 + configchanged = SetOrAddAttribute(AUTOSTART_ATTRIBUTE, myapplicationpooladdelement, "true") || configchanged;
  100 + configchanged = SetOrAddAttribute(STARTMODE_ATTRIBUTE, myapplicationpooladdelement, "AlwaysRunning") || configchanged;
  101 + configchanged = SetOrAddAttribute(SERVICEAUTOSTARTENABLED_ATTRIBUTE, mysiteapplicationelement, "true") || configchanged;
  102 + configchanged = SetOrAddAttribute(SERVICEAUTOSTARTPROVIDER_ATTRIBUTE, mysiteapplicationelement, autostartprovidername) || configchanged;
  103 +
  104 + XElement myautostartproviderselement = null;
  105 + XElement myautostartprovideraddelement = null;
  106 + configchanged = SetOrAddElement(SERVICEAUTOSTARTPROVIDERS_ELEMENT, myconfigrootxml, "", out myautostartproviderselement) || configchanged;
  107 + configchanged = SetOrAddElementWithSelectorAttribute(ADD_ELEMENT, myautostartproviderselement, NAME_ATTRIBUTE, autostartprovidername, "", out myautostartprovideraddelement) || configchanged;
  108 + configchanged = SetOrAddAttribute(TYPE_ATTRIBUTE, myautostartprovideraddelement, $"{serviceAutoStartProviderTypeFullName},{serviceAutoStartProviderAssassemblyName }") || configchanged;
  109 +
  110 + if (configchanged)
  111 + {
  112 + //configxml.Save(configfilepath);
  113 + System.IO.File.WriteAllText(configfilepath, configxml.ToString());
  114 + }
  115 + le.AddDataField("configchanged", configchanged);
  116 + //le.AddDataField("myconfigrootxml", myconfigrootxml);
  117 + le.AddSuccessResult("SUCCESS");
  118 + return true;
  119 + }
  120 + catch (Exception ex) { le.AddExceptionResult(ex); le.SetLogLevel(LogLevel.Error); return false; }
  121 + finally { le.Write(); }
  122 + }
  123 + private static bool SetOrAddElement(string elementname, XElement elementcontainer, string elementvalue, out XElement myelement)
  124 + {
  125 + bool configchanged = false;
  126 + myelement = elementcontainer?.Element(XName.Get(elementname));
  127 + if (myelement == null) { myelement = new XElement(XName.Get(elementname), ""); elementcontainer.Add(myelement); configchanged = true; }
  128 + if (myelement.Value != elementvalue) { myelement.Value = elementvalue; configchanged = true; }
  129 + return configchanged;
  130 + }
  131 + private static bool SetOrAddElementWithSelectorAttribute(string elementname, XElement elementcontainer, string selectorattributename, string selectorattributevalue, string elementvalue, out XElement myelement)
  132 + {
  133 + bool configchanged = false;
  134 + myelement = elementcontainer?.Elements(XName.Get(elementname))?.FirstOrDefault(e => e.Attribute(XName.Get(selectorattributename)).Value == selectorattributevalue);
  135 + if (myelement == null)
  136 + {
  137 + myelement = new XElement(XName.Get(elementname), "");
  138 + elementcontainer.Add(myelement);
  139 + SetOrAddAttribute(selectorattributename, myelement, selectorattributevalue);
  140 + configchanged = true;
  141 + }
  142 + if (myelement.Value != elementvalue) { myelement.Value = elementvalue; configchanged = true; }
  143 + return configchanged;
  144 + }
  145 + private static bool SetOrAddAttribute(string attrname, XElement attrcontainer, string attrvalue)
  146 + {
  147 + bool configchanged = false;
  148 + XAttribute attr = attrcontainer.Attribute(XName.Get(attrname));
  149 + if (attr == null) { attr = new XAttribute(XName.Get(attrname), ""); attrcontainer.Add(attr); configchanged = true; }
  150 + if (attr.Value != attrvalue) { attr.Value = attrvalue; configchanged = true; }
  151 + return configchanged;
  152 + }
  153 + private static string NativeSystemPath
  154 + {
  155 + get
  156 + {
  157 + if (Environment.Is64BitOperatingSystem)
  158 + {
  159 + return System.IO.Path.Combine(
  160 + Environment.GetFolderPath(Environment.SpecialFolder.Windows),
  161 + "Sysnative");
  162 + }
  163 + return Environment.GetFolderPath(Environment.SpecialFolder.System);
  164 + }
  165 + }
  166 +
  167 + private static string GetCurrentApplicationPoolName()
  168 + {
  169 + string appPoolName = string.Empty;
  170 + foreach (Application app in (new ServerManager()).Sites[System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName()].Applications)
  171 + {
  172 + if (app.Path == HttpRuntime.AppDomainAppVirtualPath) { appPoolName = app.ApplicationPoolName; }
  173 + }
  174 + return appPoolName;
  175 + }
  176 +
  177 + public static readonly HangfireBootstrapper Instance = new HangfireBootstrapper();
  178 + private BackgroundJobServer _backgroundJobServer { get; set; }
  179 + private string SqlDBconnectionstring { get; set; } = null;
  180 + private readonly object _lockObject = new object();
  181 + private bool _started;
  182 +
  183 +
  184 + public HangfireBootstrapper()
  185 + {
  186 + }
  187 +
  188 + public void Start()
  189 + {
  190 + lock (_lockObject)
  191 + {
  192 + if (_started) return;
  193 + _started = true;
  194 +
  195 + HostingEnvironment.RegisterObject(this);
  196 +
  197 + GlobalConfiguration.Configuration
  198 + .UseSqlServerStorage(SqlDBconnectionstring)
  199 + // Specify other options here
  200 + ;
  201 +
  202 + _backgroundJobServer = new BackgroundJobServer();
  203 + }
  204 + }
  205 +
  206 + public void Stop()
  207 + {
  208 + lock (_lockObject)
  209 + {
  210 + if (_backgroundJobServer != null) { _backgroundJobServer.Dispose(); }
  211 + HostingEnvironment.UnregisterObject(this);
  212 + }
  213 + }
  214 +
  215 + void IRegisteredObject.Stop(bool immediate) { Stop(); }
  216 + }
  217 +}
... ...
Vrh.Web.Reporting/Vrh.Web.Reporting.csproj
... ... @@ -329,6 +329,7 @@
329 329 <Compile Include="Global.asax.cs">
330 330 <DependentUpon>Global.asax</DependentUpon>
331 331 </Compile>
  332 + <Compile Include="HangfireBootstrapper.cs" />
332 333 <Compile Include="Properties\AssemblyInfo.cs" />
333 334 </ItemGroup>
334 335 <ItemGroup>
... ...