diff --git a/src/Microsoft.AspNet.Server.Kestrel/ServerFactory.cs b/src/Microsoft.AspNet.Server.Kestrel/ServerFactory.cs index 13b2aaac33..10b49da527 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/ServerFactory.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/ServerFactory.cs @@ -36,30 +36,44 @@ namespace Microsoft.AspNet.Server.Kestrel public IDisposable Start(IFeatureCollection serverFeatures, Func application) { - var disposables = new List(); - var information = (KestrelServerInformation)serverFeatures.Get(); - var engine = new KestrelEngine(_libraryManager, _appShutdownService); - engine.Start(information.ThreadCount == 0 ? 1 : information.ThreadCount); - foreach (var address in information.Addresses) - { - disposables.Add(engine.CreateServer( - address.Scheme, - address.Host, - address.Port, - async frame => - { - var request = new ServerRequest(frame); - await application.Invoke(request.Features).ConfigureAwait(false); - })); - } - disposables.Add(engine); - return new Disposable(() => + var disposables = new Stack(); + var disposer = new Disposable(() => { foreach (var disposable in disposables) { disposable.Dispose(); } }); + + try + { + var information = (KestrelServerInformation)serverFeatures.Get(); + var engine = new KestrelEngine(_libraryManager, _appShutdownService); + + disposables.Push(engine); + + engine.Start(information.ThreadCount == 0 ? 1 : information.ThreadCount); + + foreach (var address in information.Addresses) + { + disposables.Push(engine.CreateServer( + address.Scheme, + address.Host, + address.Port, + async frame => + { + var request = new ServerRequest(frame); + await application.Invoke(request.Features).ConfigureAwait(false); + })); + } + + return disposer; + } + catch + { + disposer.Dispose(); + throw; + } } } }