Add support for hosting within a Windows service.
This commit is contained in:
parent
f5a866ff3c
commit
83c8816eb7
17
Hosting.sln
17
Hosting.sln
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio 14
|
# Visual Studio 14
|
||||||
VisualStudioVersion = 14.0.23107.0
|
VisualStudioVersion = 14.0.24720.0
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E0497F39-AFFB-4819-A116-E39E361915AB}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E0497F39-AFFB-4819-A116-E39E361915AB}"
|
||||||
EndProject
|
EndProject
|
||||||
|
|
@ -30,6 +30,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{9C75
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "SampleStartups", "samples\SampleStartups\SampleStartups.xproj", "{485B6745-7648-400A-A969-F68FCF194E46}"
|
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "SampleStartups", "samples\SampleStartups\SampleStartups.xproj", "{485B6745-7648-400A-A969-F68FCF194E46}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.WindowsServices", "src\Microsoft.AspNet.Hosting.WindowsServices\Microsoft.AspNet.Hosting.WindowsServices.xproj", "{03148731-EA95-40A2-BAE8-A12315EA1748}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
|
@ -128,6 +130,18 @@ Global
|
||||||
{485B6745-7648-400A-A969-F68FCF194E46}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
{485B6745-7648-400A-A969-F68FCF194E46}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
{485B6745-7648-400A-A969-F68FCF194E46}.Release|x86.ActiveCfg = Release|Any CPU
|
{485B6745-7648-400A-A969-F68FCF194E46}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{485B6745-7648-400A-A969-F68FCF194E46}.Release|x86.Build.0 = Release|Any CPU
|
{485B6745-7648-400A-A969-F68FCF194E46}.Release|x86.Build.0 = Release|Any CPU
|
||||||
|
{03148731-EA95-40A2-BAE8-A12315EA1748}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{03148731-EA95-40A2-BAE8-A12315EA1748}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{03148731-EA95-40A2-BAE8-A12315EA1748}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
{03148731-EA95-40A2-BAE8-A12315EA1748}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||||
|
{03148731-EA95-40A2-BAE8-A12315EA1748}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{03148731-EA95-40A2-BAE8-A12315EA1748}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
|
{03148731-EA95-40A2-BAE8-A12315EA1748}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{03148731-EA95-40A2-BAE8-A12315EA1748}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{03148731-EA95-40A2-BAE8-A12315EA1748}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
|
{03148731-EA95-40A2-BAE8-A12315EA1748}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
|
{03148731-EA95-40A2-BAE8-A12315EA1748}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{03148731-EA95-40A2-BAE8-A12315EA1748}.Release|x86.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|
@ -141,5 +155,6 @@ Global
|
||||||
{FDBBA081-5248-4FC0-9E08-B46BEF3FA438} = {E0497F39-AFFB-4819-A116-E39E361915AB}
|
{FDBBA081-5248-4FC0-9E08-B46BEF3FA438} = {E0497F39-AFFB-4819-A116-E39E361915AB}
|
||||||
{3DA89347-6731-4366-80C4-548F24E8607B} = {E0497F39-AFFB-4819-A116-E39E361915AB}
|
{3DA89347-6731-4366-80C4-548F24E8607B} = {E0497F39-AFFB-4819-A116-E39E361915AB}
|
||||||
{485B6745-7648-400A-A969-F68FCF194E46} = {9C7520A0-F2EB-411C-8BB2-80B39C937217}
|
{485B6745-7648-400A-A969-F68FCF194E46} = {9C7520A0-F2EB-411C-8BB2-80B39C937217}
|
||||||
|
{03148731-EA95-40A2-BAE8-A12315EA1748} = {E0497F39-AFFB-4819-A116-E39E361915AB}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
|
||||||
|
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.Props" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>03148731-ea95-40a2-bae8-a12315ea1748</ProjectGuid>
|
||||||
|
<RootNamespace>Microsoft.AspNet.Hosting.WindowsServices</RootNamespace>
|
||||||
|
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">..\..\artifacts\obj\$(MSBuildProjectName)</BaseIntermediateOutputPath>
|
||||||
|
<OutputPath Condition="'$(OutputPath)'=='' ">..\..\artifacts\bin\$(MSBuildProjectName)\</OutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'" />
|
||||||
|
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.targets" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
</Project>
|
||||||
|
|
@ -0,0 +1,39 @@
|
||||||
|
using System.ServiceProcess;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNet.Hosting.WindowsServices
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Extensions to <see cref="IWebApplication" for hosting inside a Windows service. />
|
||||||
|
/// </summary>
|
||||||
|
public static class WebApplicationExtensions
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Runs the specified web application inside a Windows service and blocks until the service is stopped.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="application">An instance of the <see cref="IWebApplication"/> to host in the Windows service.</param>
|
||||||
|
/// <example>
|
||||||
|
/// This example shows how to use <see cref="WebApplicationService.Run"/>.
|
||||||
|
/// <code>
|
||||||
|
/// public class Program
|
||||||
|
/// {
|
||||||
|
/// public static void Main(string[] args)
|
||||||
|
/// {
|
||||||
|
/// var config = WebApplicationConfiguration.GetDefault(args);
|
||||||
|
///
|
||||||
|
/// var application = new WebApplicationBuilder()
|
||||||
|
/// .UseConfiguration(config)
|
||||||
|
/// .Build();
|
||||||
|
///
|
||||||
|
/// // This call will block until the service is stopped.
|
||||||
|
/// application.RunAsService();
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// </code>
|
||||||
|
/// </example>
|
||||||
|
public static void RunAsService(this IWebApplication application)
|
||||||
|
{
|
||||||
|
var webApplicationService = new WebApplicationService(application);
|
||||||
|
ServiceBase.Run(webApplicationService);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,80 @@
|
||||||
|
using Microsoft.AspNet.Hosting.Internal;
|
||||||
|
using Microsoft.Extensions.Configuration;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using System;
|
||||||
|
using System.ServiceProcess;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNet.Hosting.WindowsServices
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Provides an implementation of a Windows service that hosts ASP.NET.
|
||||||
|
/// </summary>
|
||||||
|
public class WebApplicationService : ServiceBase
|
||||||
|
{
|
||||||
|
private const string HostingJsonFile = "hosting.json";
|
||||||
|
private const string EnvironmentVariablesPrefix = "ASPNET_";
|
||||||
|
private const string ConfigFileKey = "config";
|
||||||
|
private IWebApplication _application;
|
||||||
|
private IDisposable _applicationShutdown;
|
||||||
|
private bool _stopRequestedByWindows;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates an instance of <c>WebApplicationService</c> which hosts the specified web application.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="application">The web application to host in the Windows service.</param>
|
||||||
|
public WebApplicationService(IWebApplication application)
|
||||||
|
{
|
||||||
|
_application = application;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected sealed override void OnStart(string[] args)
|
||||||
|
{
|
||||||
|
OnStarting(args);
|
||||||
|
|
||||||
|
_application
|
||||||
|
.Services
|
||||||
|
.GetRequiredService<IApplicationLifetime>()
|
||||||
|
.ApplicationStopped
|
||||||
|
.Register(() =>
|
||||||
|
{
|
||||||
|
if (!_stopRequestedByWindows)
|
||||||
|
{
|
||||||
|
Stop();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
_applicationShutdown = _application.Start();
|
||||||
|
|
||||||
|
OnStarted();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected sealed override void OnStop()
|
||||||
|
{
|
||||||
|
_stopRequestedByWindows = true;
|
||||||
|
OnStopping();
|
||||||
|
_applicationShutdown?.Dispose();
|
||||||
|
OnStopped();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Executes before ASP.NET starts.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="args">The command line arguments passed to the service.</param>
|
||||||
|
protected virtual void OnStarting(string[] args) { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Executes after ASP.NET starts.
|
||||||
|
/// </summary>
|
||||||
|
protected virtual void OnStarted() { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Executes before ASP.NET shuts down.
|
||||||
|
/// </summary>
|
||||||
|
protected virtual void OnStopping() { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Executes after ASP.NET shuts down.
|
||||||
|
/// </summary>
|
||||||
|
protected virtual void OnStopped() { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
{
|
||||||
|
"version": "1.0.0-*",
|
||||||
|
"description": "ASP.NET 5 core hosting infrastructure and startup logic for web applications running within a Windows service.",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/aspnet/hosting"
|
||||||
|
},
|
||||||
|
"compilationOptions": {
|
||||||
|
"warningsAsErrors": true,
|
||||||
|
"keyFile": "../../tools/Key.snk"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.AspNet.Hosting": "1.0.0-*"
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net451": {
|
||||||
|
"frameworkAssemblies": {
|
||||||
|
"System.ServiceProcess": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue