diff --git a/Quartzmin.sln b/Quartzmin.sln index 8e421a0..d608f17 100644 --- a/Quartzmin.sln +++ b/Quartzmin.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28010.2050 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29326.143 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Quartzmin", "Source\Quartzmin\Quartzmin.csproj", "{E14F97E0-8B3B-43A2-9820-2F4B94497253}" EndProject @@ -19,7 +19,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NetCoreSelfHost", "Source\E EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WinFormSelfHost", "Source\Examples\WinFormSelfHost\WinFormSelfHost.csproj", "{C54F4403-F40A-497C-B3A7-D1F1E1830D52}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AspNetCoreDocker", "Source\Examples\AspNetCoreDocker\AspNetCoreDocker.csproj", "{68D816F2-21BF-4376-ABF4-70390E4783C5}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AspNetCoreDocker", "Source\Examples\AspNetCoreDocker\AspNetCoreDocker.csproj", "{68D816F2-21BF-4376-ABF4-70390E4783C5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AspNetCore3", "Source\Examples\AspNetCore3\AspNetCore3.csproj", "{3B2A3329-3BBB-4C6B-A42A-07EE565A2EB8}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -59,6 +61,10 @@ Global {68D816F2-21BF-4376-ABF4-70390E4783C5}.Debug|Any CPU.Build.0 = Debug|Any CPU {68D816F2-21BF-4376-ABF4-70390E4783C5}.Release|Any CPU.ActiveCfg = Release|Any CPU {68D816F2-21BF-4376-ABF4-70390E4783C5}.Release|Any CPU.Build.0 = Release|Any CPU + {3B2A3329-3BBB-4C6B-A42A-07EE565A2EB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3B2A3329-3BBB-4C6B-A42A-07EE565A2EB8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3B2A3329-3BBB-4C6B-A42A-07EE565A2EB8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3B2A3329-3BBB-4C6B-A42A-07EE565A2EB8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -69,43 +75,9 @@ Global {7CF90DB9-37C4-4704-910E-BF1DB8AB79F1} = {B669A725-70A9-4E80-BAC7-9765A14CAAA4} {C54F4403-F40A-497C-B3A7-D1F1E1830D52} = {B669A725-70A9-4E80-BAC7-9765A14CAAA4} {68D816F2-21BF-4376-ABF4-70390E4783C5} = {B669A725-70A9-4E80-BAC7-9765A14CAAA4} + {3B2A3329-3BBB-4C6B-A42A-07EE565A2EB8} = {B669A725-70A9-4E80-BAC7-9765A14CAAA4} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {0357313D-BD09-4C5D-AF0D-439B3BD33B5A} EndGlobalSection - GlobalSection(TeamFoundationVersionControl) = preSolution - SccNumberOfProjects = 9 - SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C} - SccTeamFoundationServer = http://tfs/defaultcollection - SccLocalPath0 = . - SccProjectUniqueName1 = Source\\Quartzmin\\Quartzmin.csproj - SccProjectName1 = Source/Quartzmin - SccLocalPath1 = Source\\Quartzmin - SccProjectUniqueName2 = Source\\Quartz.Plugins.RecentHistory\\Quartz.Plugins.RecentHistory.csproj - SccProjectName2 = Source/Quartz.Plugins.RecentHistory - SccLocalPath2 = Source\\Quartz.Plugins.RecentHistory - SccProjectUniqueName3 = Source\\Quartzmin.SelfHost\\Quartzmin.SelfHost.csproj - SccProjectName3 = Source/Quartzmin.SelfHost - SccLocalPath3 = Source\\Quartzmin.SelfHost - SccProjectUniqueName4 = Source\\Examples\\NetCoreSelfHost\\NetCoreSelfHost.csproj - SccProjectTopLevelParentUniqueName4 = Quartzmin.sln - SccProjectName4 = Source/Examples/NetCoreSelfHost - SccLocalPath4 = Source\\Examples\\NetCoreSelfHost - SccProjectUniqueName5 = Source\\Examples\\AspNetCoreHost\\AspNetCoreHost.csproj - SccProjectTopLevelParentUniqueName5 = Quartzmin.sln - SccProjectName5 = Source/Examples/AspNetCoreHost - SccLocalPath5 = Source\\Examples\\AspNetCoreHost - SccProjectUniqueName6 = Source\\Examples\\AspNetWebHost\\AspNetWebHost.csproj - SccProjectTopLevelParentUniqueName6 = Quartzmin.sln - SccProjectName6 = Source/Examples/AspNetWebHost - SccLocalPath6 = Source\\Examples\\AspNetWebHost - SccProjectUniqueName7 = Source\\Examples\\WinFormSelfHost\\WinFormSelfHost.csproj - SccProjectTopLevelParentUniqueName7 = Quartzmin.sln - SccProjectName7 = Source/Examples/WinFormSelfHost - SccLocalPath7 = Source\\Examples\\WinFormSelfHost - SccProjectUniqueName8 = Source\\Examples\\AspNetCoreDocker\\AspNetCoreDocker.csproj - SccProjectTopLevelParentUniqueName8 = Quartzmin.sln - SccProjectName8 = Source/Examples/AspNetCoreDocker - SccLocalPath8 = Source\\Examples\\AspNetCoreDocker - EndGlobalSection EndGlobal diff --git a/Source/Examples/AspNetCore3/AspNetCore3.csproj b/Source/Examples/AspNetCore3/AspNetCore3.csproj new file mode 100644 index 0000000..72bbec6 --- /dev/null +++ b/Source/Examples/AspNetCore3/AspNetCore3.csproj @@ -0,0 +1,20 @@ + + + + netcoreapp3.1 + InProcess + + + + + + + + + + + + + + + diff --git a/Source/Examples/AspNetCore3/Program.cs b/Source/Examples/AspNetCore3/Program.cs new file mode 100644 index 0000000..497ac5b --- /dev/null +++ b/Source/Examples/AspNetCore3/Program.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNetCore; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using Quartzmin; + +namespace AspNetCore3 +{ + public class Program + { + public static void Main( string[] args ) + { + var scheduler = DemoScheduler.Create().Result; + + var host = WebHost.CreateDefaultBuilder( args ).Configure( app => + { + app.UseQuartzmin( new QuartzminOptions() { Scheduler = scheduler } ); + + } ).ConfigureServices( services => + { + services.AddQuartzmin(); + + } ) + .Build(); + + host.Start(); + + while ( !scheduler.IsShutdown ) + Thread.Sleep( 250 ); + } + } +} diff --git a/Source/Examples/AspNetCore3/appsettings.Development.json b/Source/Examples/AspNetCore3/appsettings.Development.json new file mode 100644 index 0000000..e203e94 --- /dev/null +++ b/Source/Examples/AspNetCore3/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Debug", + "System": "Information", + "Microsoft": "Information" + } + } +} diff --git a/Source/Examples/AspNetCore3/appsettings.json b/Source/Examples/AspNetCore3/appsettings.json new file mode 100644 index 0000000..def9159 --- /dev/null +++ b/Source/Examples/AspNetCore3/appsettings.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/Source/Quartzmin/ApplicationBuilderExtensions.cs b/Source/Quartzmin/ApplicationBuilderExtensions.cs index dfee55d..f536050 100644 --- a/Source/Quartzmin/ApplicationBuilderExtensions.cs +++ b/Source/Quartzmin/ApplicationBuilderExtensions.cs @@ -1,4 +1,4 @@ -#if NETSTANDARD +#if ( NETSTANDARD || NETCOREAPP ) using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Diagnostics; @@ -13,65 +13,85 @@ namespace Quartzmin { public static class ApplicationBuilderExtensions { - public static void UseQuartzmin(this IApplicationBuilder app, QuartzminOptions options, Action configure = null) + public static void UseQuartzmin( this IApplicationBuilder app, QuartzminOptions options, Action configure = null ) { - options = options ?? throw new ArgumentNullException(nameof(options)); + options = options ?? throw new ArgumentNullException( nameof( options ) ); - app.UseFileServer(options); + app.UseFileServer( options ); - var services = Services.Create(options); - configure?.Invoke(services); + var services = Services.Create( options ); + configure?.Invoke( services ); - app.Use(async (context, next) => + app.Use( async ( context, next ) => + { + context.Items[typeof( Services )] = services; + await next.Invoke(); + } ); + + app.UseExceptionHandler( errorApp => + { + errorApp.Run( async context => + { + var ex = context.Features.Get().Error; + context.Response.StatusCode = 500; + context.Response.ContentType = "text/html"; + await context.Response.WriteAsync( services.ViewEngine.ErrorPage( ex ) ); + } ); + } ); + +#if NETCOREAPP + app.UseRouting(); + app.UseEndpoints( endpoints => { - context.Items[typeof(Services)] = services; - await next.Invoke(); - }); - - app.UseExceptionHandler(errorApp => - { - errorApp.Run(async context => - { - var ex = context.Features.Get().Error; - context.Response.StatusCode = 500; - context.Response.ContentType = "text/html"; - await context.Response.WriteAsync(services.ViewEngine.ErrorPage(ex)); - }); - }); - - app.UseMvc(routes => + endpoints.MapControllerRoute( nameof( Quartzmin ), "{controller=Scheduler}/{action=Index}" ); + } ); +#else + app.UseMvc( routes => { routes.MapRoute( - name: nameof(Quartzmin), - template: "{controller=Scheduler}/{action=Index}"); - }); + name: nameof( Quartzmin ), + template: "{controller=Scheduler}/{action=Index}" ); + } ); +#endif } - private static void UseFileServer(this IApplicationBuilder app, QuartzminOptions options) + private static void UseFileServer( this IApplicationBuilder app, QuartzminOptions options ) { IFileProvider fs; - if (string.IsNullOrEmpty(options.ContentRootDirectory)) - fs = new ManifestEmbeddedFileProvider(Assembly.GetExecutingAssembly(), "Content"); + if ( string.IsNullOrEmpty( options.ContentRootDirectory ) ) + fs = new ManifestEmbeddedFileProvider( Assembly.GetExecutingAssembly(), "Content" ); else - fs = new PhysicalFileProvider(options.ContentRootDirectory); + fs = new PhysicalFileProvider( options.ContentRootDirectory ); var fsOptions = new FileServerOptions() { - RequestPath = new PathString("/Content"), + RequestPath = new PathString( "/Content" ), EnableDefaultFiles = false, EnableDirectoryBrowsing = false, FileProvider = fs }; - app.UseFileServer(fsOptions); + app.UseFileServer( fsOptions ); } - public static void AddQuartzmin(this IServiceCollection services) +#if NETCOREAPP + public static void AddQuartzmin( this IServiceCollection services ) { - services.AddMvcCore() - .AddApplicationPart(Assembly.GetExecutingAssembly()) - .AddJsonFormatters(); + services.AddControllers( options => + { + //options.EnableEndpointRouting = false; + } ) + .AddApplicationPart( Assembly.GetExecutingAssembly() ) + .AddNewtonsoftJson(); } +#else + public static void AddQuartzmin( this IServiceCollection services ) + { + services.AddMvcCore() + .AddApplicationPart( Assembly.GetExecutingAssembly() ) + .AddJsonFormatters(); + } +#endif } } diff --git a/Source/Quartzmin/Controllers/CalendarsController.cs b/Source/Quartzmin/Controllers/CalendarsController.cs index 59bae37..4b93833 100644 --- a/Source/Quartzmin/Controllers/CalendarsController.cs +++ b/Source/Quartzmin/Controllers/CalendarsController.cs @@ -7,7 +7,7 @@ using System.Linq; using System.Threading.Tasks; #region Target-Specific Directives -#if NETSTANDARD +#if ( NETSTANDARD || NETCOREAPP ) using Microsoft.AspNetCore.Mvc; #endif #if NETFRAMEWORK diff --git a/Source/Quartzmin/Controllers/ExecutionsController.cs b/Source/Quartzmin/Controllers/ExecutionsController.cs index 2635871..8a39e59 100644 --- a/Source/Quartzmin/Controllers/ExecutionsController.cs +++ b/Source/Quartzmin/Controllers/ExecutionsController.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; using System.Globalization; #region Target-Specific Directives -#if NETSTANDARD +#if ( NETSTANDARD || NETCOREAPP ) using Microsoft.AspNetCore.Mvc; #endif #if NETFRAMEWORK diff --git a/Source/Quartzmin/Controllers/HistoryController.cs b/Source/Quartzmin/Controllers/HistoryController.cs index cf0e84d..7be408b 100644 --- a/Source/Quartzmin/Controllers/HistoryController.cs +++ b/Source/Quartzmin/Controllers/HistoryController.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using System.Threading.Tasks; #region Target-Specific Directives -#if NETSTANDARD +#if ( NETSTANDARD || NETCOREAPP ) using Microsoft.AspNetCore.Mvc; #endif #if NETFRAMEWORK diff --git a/Source/Quartzmin/Controllers/JobDataMapController.cs b/Source/Quartzmin/Controllers/JobDataMapController.cs index e77104e..ac4e71a 100644 --- a/Source/Quartzmin/Controllers/JobDataMapController.cs +++ b/Source/Quartzmin/Controllers/JobDataMapController.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; using System.Threading; #region Target-Specific Directives -#if NETSTANDARD +#if ( NETSTANDARD || NETCOREAPP ) using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Http.Features; #endif @@ -37,8 +37,12 @@ namespace Quartzmin.Controllers } catch (JsonSerializationException ex) when (ex.Message.StartsWith("Could not create an instance of type")) { - return new BadRequestResult() { ReasonPhrase = "Unknown Type Handler" }; - } +#if NETCOREAPP + return new BadRequestResult(); +#else + return new BadRequestResult() { ReasonPhrase = "Unknown Type Handler" }; +#endif + } var dataMapForm = (await formData.GetJobDataMapForm(includeRowIndex: false)).SingleOrDefault(); // expected single row diff --git a/Source/Quartzmin/Controllers/JobsController.cs b/Source/Quartzmin/Controllers/JobsController.cs index 5b5b527..f561c74 100644 --- a/Source/Quartzmin/Controllers/JobsController.cs +++ b/Source/Quartzmin/Controllers/JobsController.cs @@ -9,7 +9,7 @@ using System.Linq; using System.Threading.Tasks; #region Target-Specific Directives -#if NETSTANDARD +#if ( NETSTANDARD || NETCOREAPP ) using Microsoft.AspNetCore.Mvc; #endif #if NETFRAMEWORK diff --git a/Source/Quartzmin/Controllers/PageControllerBase.cs b/Source/Quartzmin/Controllers/PageControllerBase.cs index 93794d3..14b40cb 100644 --- a/Source/Quartzmin/Controllers/PageControllerBase.cs +++ b/Source/Quartzmin/Controllers/PageControllerBase.cs @@ -5,19 +5,20 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using Quartzmin.Models; +using Quartzmin.Helpers; using Quartz; namespace Quartzmin.Controllers { - #region Target-Specific Directives + #region Target-Specific Directives -#if NETSTANDARD +#if ( NETSTANDARD || NETCOREAPP ) using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Primitives; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; - public abstract partial class PageControllerBase : Microsoft.AspNetCore.Mvc.ControllerBase + public abstract partial class PageControllerBase : Microsoft.AspNetCore.Mvc.ControllerBase { private static readonly JsonSerializerSettings _serializerSettings = new JsonSerializerSettings() { @@ -26,7 +27,8 @@ namespace Quartzmin.Controllers protected Services Services => (Services) Request.HttpContext.Items[typeof(Services)]; protected string GetRouteData(string key) => RouteData.Values[key].ToString(); - protected IActionResult Json(object content) => new JsonResult(content, _serializerSettings); + protected IActionResult Json( object content ) => new JsonResult( content, _serializerSettings ); + protected IActionResult NotModified() => new StatusCodeResult(304); @@ -83,9 +85,9 @@ namespace Quartzmin.Controllers } #endif - #endregion +#endregion - public abstract partial class PageControllerBase + public abstract partial class PageControllerBase { protected IScheduler Scheduler => Services.Scheduler; diff --git a/Source/Quartzmin/Controllers/SchedulerController.cs b/Source/Quartzmin/Controllers/SchedulerController.cs index baa46a0..758017f 100644 --- a/Source/Quartzmin/Controllers/SchedulerController.cs +++ b/Source/Quartzmin/Controllers/SchedulerController.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; using System.Globalization; #region Target-Specific Directives -#if NETSTANDARD +#if ( NETSTANDARD || NETCOREAPP ) using Microsoft.AspNetCore.Mvc; #endif #if NETFRAMEWORK diff --git a/Source/Quartzmin/Controllers/TriggersController.cs b/Source/Quartzmin/Controllers/TriggersController.cs index 0ad8d60..c69dbd0 100644 --- a/Source/Quartzmin/Controllers/TriggersController.cs +++ b/Source/Quartzmin/Controllers/TriggersController.cs @@ -9,7 +9,7 @@ using System.Linq; using System.Threading.Tasks; #region Target-Specific Directives -#if NETSTANDARD +#if ( NETSTANDARD || NETCOREAPP ) using Microsoft.AspNetCore.Mvc; #endif #if NETFRAMEWORK diff --git a/Source/Quartzmin/Extensions.cs b/Source/Quartzmin/Extensions.cs index 9fbe948..bb0d5b2 100644 --- a/Source/Quartzmin/Extensions.cs +++ b/Source/Quartzmin/Extensions.cs @@ -13,7 +13,7 @@ using Quartz.Impl.Matchers; using Quartz.Plugins.RecentHistory; #region Target-Specific Directives -#if NETSTANDARD +#if ( NETSTANDARD || NETCOREAPP ) using HttpRequest = Microsoft.AspNetCore.Http.HttpRequest; #endif #if NETFRAMEWORK @@ -68,8 +68,8 @@ namespace Quartzmin public static string ReadAsString(this HttpRequest request) { -#if NETSTANDARD - using (var ms = new MemoryStream()) +#if ( NETSTANDARD || NETCOREAPP ) + using ( var ms = new MemoryStream()) { request.Body.CopyTo(ms); return Encoding.UTF8.GetString(ms.ToArray()); diff --git a/Source/Quartzmin/Helpers/JobDataMapRequest.cs b/Source/Quartzmin/Helpers/JobDataMapRequest.cs index bf7af68..044ff87 100644 --- a/Source/Quartzmin/Helpers/JobDataMapRequest.cs +++ b/Source/Quartzmin/Helpers/JobDataMapRequest.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Threading.Tasks; #region Target-Specific Directives -#if NETSTANDARD +#if ( NETSTANDARD || NETCOREAPP ) using HttpRequest = Microsoft.AspNetCore.Http.HttpRequest; #endif #if NETFRAMEWORK @@ -57,8 +57,8 @@ namespace Quartzmin.Helpers return field.Substring(n + 1); } -#if NETSTANDARD - public static Task>> GetFormData(this HttpRequest request) +#if ( NETSTANDARD || NETCOREAPP ) + public static Task>> GetFormData(this HttpRequest request) { var result = new List>(); diff --git a/Source/Quartzmin/Helpers/JsonErrorResponse.cs b/Source/Quartzmin/Helpers/JsonErrorResponse.cs index 02650b0..ca167d1 100644 --- a/Source/Quartzmin/Helpers/JsonErrorResponse.cs +++ b/Source/Quartzmin/Helpers/JsonErrorResponse.cs @@ -1,14 +1,18 @@  namespace Quartzmin.Helpers { -#if NETSTANDARD +#if (NETSTANDARD || NETCOREAPP) using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; + using Newtonsoft.Json.Serialization; public class JsonErrorResponseAttribute : ActionFilterAttribute { - static readonly JsonSerializerSettings _serializerSettings = new JsonSerializerSettings(); + private static readonly JsonSerializerSettings _serializerSettings = new JsonSerializerSettings() + { + ContractResolver = new DefaultContractResolver(), // PascalCase as default + }; public override void OnActionExecuted(ActionExecutedContext context) { diff --git a/Source/Quartzmin/Helpers/JsonPascalCaseNamingPolicy.cs b/Source/Quartzmin/Helpers/JsonPascalCaseNamingPolicy.cs new file mode 100644 index 0000000..dc1f311 --- /dev/null +++ b/Source/Quartzmin/Helpers/JsonPascalCaseNamingPolicy.cs @@ -0,0 +1,15 @@ +#if NETCOREAPP +using System; +using System.Text.Json; + +namespace Quartzmin.Helpers +{ + public class JsonPascalCaseNamingPolicy : JsonNamingPolicy + { + public override string ConvertName( string name ) + { + return name; + } + } +} +#endif \ No newline at end of file diff --git a/Source/Quartzmin/Models/FormFile.cs b/Source/Quartzmin/Models/FormFile.cs index 63d970d..21c02d6 100644 --- a/Source/Quartzmin/Models/FormFile.cs +++ b/Source/Quartzmin/Models/FormFile.cs @@ -4,8 +4,8 @@ namespace Quartzmin.Models { public class FormFile { -#if NETSTANDARD - readonly Microsoft.AspNetCore.Http.IFormFile _file; +#if ( NETSTANDARD || NETCOREAPP ) + readonly Microsoft.AspNetCore.Http.IFormFile _file; public FormFile(Microsoft.AspNetCore.Http.IFormFile file) => _file = file; public Stream GetStream() => _file.OpenReadStream(); diff --git a/Source/Quartzmin/Quartzmin.csproj b/Source/Quartzmin/Quartzmin.csproj index 1feec98..13c62cf 100644 --- a/Source/Quartzmin/Quartzmin.csproj +++ b/Source/Quartzmin/Quartzmin.csproj @@ -1,78 +1,91 @@  - - netstandard2.0;net452 - PackageReference - true - true - 1591 - true + + netstandard2.0;netcoreapp3.1;net452 + PackageReference + true + true + 1591 + true - 1.0.3 - Quartzmin - Web management tool for Quartz.NET - Jan Lucansky - https://github.com/jlucansky/Quartzmin - https://raw.githubusercontent.com/jlucansky/public-assets/master/Quartzmin/avatar.png - Powerful, easy to use web management tool for Quartz.NET - quartz;web;ui - 1.0.0.0 - 1.0.0.0 - LICENSE - Copyright © 2018 Jan Lucansky - git - https://github.com/jlucansky/Quartzmin - + 1.0.3 + Quartzmin + Web management tool for Quartz.NET + Jan Lucansky + https://github.com/jlucansky/Quartzmin + https://raw.githubusercontent.com/jlucansky/public-assets/master/Quartzmin/avatar.png + Powerful, easy to use web management tool for Quartz.NET + quartz;web;ui + 1.0.0.0 + 1.0.0.0 + LICENSE + Copyright © 2018 Jan Lucansky + git + https://github.com/jlucansky/Quartzmin + false + true + - - NETFRAMEWORK - $(AssemblySearchPaths);{GAC} - - - NETSTANDARD - + + NETFRAMEWORK + $(AssemblySearchPaths);{GAC} + + + NETSTANDARD + + + NETCOREAPP + - - - + + + - - - - - - - - - - - - - + + + + + - - - - - - - - - + + + + + + + - - - + + + + + + + + + - - - + + + + + + + - - - - - - + + + + + + + + + + + + + +