Log status of port before starting server with SelfHostDeployer (#993)

This commit is contained in:
Nate McMaster 2017-03-28 10:48:46 -07:00 committed by GitHub
parent 10cdfd9fa2
commit f79904404e
2 changed files with 84 additions and 1 deletions

View File

@ -0,0 +1,77 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Server.IntegrationTesting
{
public class PortHelper
{
public static void LogPortStatus(ILogger logger, int port)
{
logger.LogInformation("Checking for processes currently using port {0}", port);
var psi = new ProcessStartInfo
{
RedirectStandardOutput = true,
RedirectStandardError = true,
};
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
psi.FileName = "cmd";
psi.Arguments = $"/C netstat -nq | find \"{port}\"";
}
else
{
psi.FileName = "lsof";
psi.Arguments = $"-i :{port}";
}
var process = new Process
{
StartInfo = psi,
EnableRaisingEvents = true
};
var linesLogged = false;
process.OutputDataReceived += (sender, data) =>
{
if (!string.IsNullOrWhiteSpace(data.Data))
{
linesLogged = true;
logger.LogInformation("portstatus: {0}", data.Data);
}
};
process.ErrorDataReceived += (sender, data) =>
{
if (!string.IsNullOrWhiteSpace(data.Data))
{
logger.LogWarning("portstatus: {0}", data.Data);
}
};
try
{
process.Start();
process.BeginErrorReadLine();
process.BeginOutputReadLine();
process.WaitForExit();
if (!linesLogged)
{
logger.LogInformation("portstatus: it appears the port {0} is not in use.", port);
}
}
catch (Exception ex)
{
logger.LogWarning("Failed to check port status. Executed: {0} {1}\nError: {2}", psi.FileName, psi.Arguments, ex.ToString());
}
return;
}
}
}

View File

@ -83,6 +83,12 @@ namespace Microsoft.AspNetCore.Server.IntegrationTesting
executableArgs = $"run --framework {targetFramework} {DotnetArgumentSeparator}";
}
if (uri.Port != 0)
{
// shows output from netstat/lsof. May be useful if the port is already in use
PortHelper.LogPortStatus(Logger, uri.Port);
}
executableArgs += $" --server.urls {uri} "
+ $" --server {(DeploymentParameters.ServerType == ServerType.WebListener ? "Microsoft.AspNetCore.Server.HttpSys" : "Microsoft.AspNetCore.Server.Kestrel")}";
@ -148,4 +154,4 @@ namespace Microsoft.AspNetCore.Server.IntegrationTesting
StopTimer();
}
}
}
}