Allow running some IIS Express variants without publishing #1431
This commit is contained in:
parent
23e3ab6555
commit
8d55a447d4
|
|
@ -102,7 +102,7 @@ namespace Microsoft.AspNetCore.Server.IntegrationTesting
|
||||||
|
|
||||||
public string ServerConfigLocation { get; set; }
|
public string ServerConfigLocation { get; set; }
|
||||||
|
|
||||||
public string SiteName { get; set; }
|
public string SiteName { get; set; } = "HttpTestSite";
|
||||||
|
|
||||||
public string ApplicationPath { get; set; }
|
public string ApplicationPath { get; set; }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Server.IntegrationTesting.Common
|
namespace Microsoft.AspNetCore.Server.IntegrationTesting
|
||||||
{
|
{
|
||||||
internal static class DotNetCommands
|
internal static class DotNetCommands
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -161,6 +161,22 @@ namespace Microsoft.AspNetCore.Server.IntegrationTesting
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected string GetDotNetExeForArchitecture()
|
||||||
|
{
|
||||||
|
var executableName = DotnetCommandName;
|
||||||
|
// We expect x64 dotnet.exe to be on the path but we have to go searching for the x86 version.
|
||||||
|
if (DotNetCommands.IsRunningX86OnX64(DeploymentParameters.RuntimeArchitecture))
|
||||||
|
{
|
||||||
|
executableName = DotNetCommands.GetDotNetExecutable(DeploymentParameters.RuntimeArchitecture);
|
||||||
|
if (!File.Exists(executableName))
|
||||||
|
{
|
||||||
|
throw new Exception($"Unable to find '{executableName}'.'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return executableName;
|
||||||
|
}
|
||||||
|
|
||||||
protected void ShutDownIfAnyHostProcess(Process hostProcess)
|
protected void ShutDownIfAnyHostProcess(Process hostProcess)
|
||||||
{
|
{
|
||||||
if (hostProcess != null && !hostProcess.HasExited)
|
if (hostProcess != null && !hostProcess.HasExited)
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,9 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using System.Globalization;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
@ -42,15 +42,52 @@ namespace Microsoft.AspNetCore.Server.IntegrationTesting
|
||||||
// Start timer
|
// Start timer
|
||||||
StartTimer();
|
StartTimer();
|
||||||
|
|
||||||
// For now we always auto-publish. Otherwise we'll have to write our own local web.config for the HttpPlatformHandler
|
// For an unpublished application the dllroot points pre-built dlls like projectdir/bin/debug/net461/
|
||||||
DotnetPublish();
|
// and contentRoot points to the project directory so you get things like static assets.
|
||||||
|
// For a published app both point to the publish directory.
|
||||||
|
var dllRoot = CheckIfPublishIsRequired();
|
||||||
|
var contentRoot = string.Empty;
|
||||||
|
if (DeploymentParameters.PublishApplicationBeforeDeployment)
|
||||||
|
{
|
||||||
|
DotnetPublish();
|
||||||
|
contentRoot = DeploymentParameters.PublishedApplicationRootPath;
|
||||||
|
dllRoot = contentRoot;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Core+Standalone always publishes. This must be Clr+Standalone or Core+Portable.
|
||||||
|
// Update processPath and arguments for our current scenario
|
||||||
|
contentRoot = DeploymentParameters.ApplicationPath;
|
||||||
|
|
||||||
var contentRoot = DeploymentParameters.PublishedApplicationRootPath;
|
var executableExtension = DeploymentParameters.ApplicationType == ApplicationType.Portable ? ".dll" : ".exe";
|
||||||
|
var entryPoint = Path.Combine(dllRoot, DeploymentParameters.ApplicationName + executableExtension);
|
||||||
|
|
||||||
|
var executableName = string.Empty;
|
||||||
|
var executableArgs = string.Empty;
|
||||||
|
|
||||||
|
if (DeploymentParameters.RuntimeFlavor == RuntimeFlavor.CoreClr && DeploymentParameters.ApplicationType == ApplicationType.Portable)
|
||||||
|
{
|
||||||
|
executableName = GetDotNetExeForArchitecture();
|
||||||
|
executableArgs = entryPoint;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
executableName = entryPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
Logger.LogInformation("Executing: {exe} {args}", executableName, executableArgs);
|
||||||
|
DeploymentParameters.EnvironmentVariables["LAUNCHER_PATH"] = executableName;
|
||||||
|
DeploymentParameters.EnvironmentVariables["LAUNCHER_ARGS"] = executableArgs;
|
||||||
|
|
||||||
|
// CurrentDirectory will point to bin/{config}/{tfm}, but the config and static files aren't copied, point to the app base instead.
|
||||||
|
Logger.LogInformation("ContentRoot: {path}", DeploymentParameters.ApplicationPath);
|
||||||
|
DeploymentParameters.EnvironmentVariables["ASPNETCORE_CONTENTROOT"] = DeploymentParameters.ApplicationPath;
|
||||||
|
}
|
||||||
|
|
||||||
var testUri = TestUriHelper.BuildTestUri(ServerType.IISExpress, DeploymentParameters.ApplicationBaseUriHint);
|
var testUri = TestUriHelper.BuildTestUri(ServerType.IISExpress, DeploymentParameters.ApplicationBaseUriHint);
|
||||||
|
|
||||||
// Launch the host process.
|
// Launch the host process.
|
||||||
var (actualUri, hostExitToken) = await StartIISExpressAsync(testUri, contentRoot);
|
var (actualUri, hostExitToken) = await StartIISExpressAsync(testUri, contentRoot, dllRoot);
|
||||||
|
|
||||||
Logger.LogInformation("Application ready at URL: {appUrl}", actualUri);
|
Logger.LogInformation("Application ready at URL: {appUrl}", actualUri);
|
||||||
|
|
||||||
|
|
@ -64,7 +101,43 @@ namespace Microsoft.AspNetCore.Server.IntegrationTesting
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<(Uri url, CancellationToken hostExitToken)> StartIISExpressAsync(Uri uri, string contentRoot)
|
private string CheckIfPublishIsRequired()
|
||||||
|
{
|
||||||
|
var targetFramework = DeploymentParameters.TargetFramework;
|
||||||
|
|
||||||
|
// IISIntegration uses this layout
|
||||||
|
var dllRoot = Path.Combine(DeploymentParameters.ApplicationPath, "bin", DeploymentParameters.RuntimeArchitecture.ToString(),
|
||||||
|
DeploymentParameters.Configuration, targetFramework);
|
||||||
|
|
||||||
|
if (!Directory.Exists(dllRoot))
|
||||||
|
{
|
||||||
|
// Most repos use this layout
|
||||||
|
dllRoot = Path.Combine(DeploymentParameters.ApplicationPath, "bin", DeploymentParameters.Configuration, targetFramework);
|
||||||
|
|
||||||
|
if (!Directory.Exists(dllRoot))
|
||||||
|
{
|
||||||
|
// The bits we need weren't pre-compiled, compile on publish
|
||||||
|
DeploymentParameters.PublishApplicationBeforeDeployment = true;
|
||||||
|
}
|
||||||
|
else if (DeploymentParameters.RuntimeFlavor == RuntimeFlavor.Clr
|
||||||
|
&& DeploymentParameters.RuntimeArchitecture == RuntimeArchitecture.x86)
|
||||||
|
{
|
||||||
|
// x64 is the default. Publish to rebuild for the right bitness
|
||||||
|
DeploymentParameters.PublishApplicationBeforeDeployment = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DeploymentParameters.RuntimeFlavor == RuntimeFlavor.CoreClr
|
||||||
|
&& DeploymentParameters.ApplicationType == ApplicationType.Standalone)
|
||||||
|
{
|
||||||
|
// Publish is always required to get the correct standalone files in the output directory
|
||||||
|
DeploymentParameters.PublishApplicationBeforeDeployment = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return dllRoot;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<(Uri url, CancellationToken hostExitToken)> StartIISExpressAsync(Uri uri, string contentRoot, string dllRoot)
|
||||||
{
|
{
|
||||||
using (Logger.BeginScope("StartIISExpress"))
|
using (Logger.BeginScope("StartIISExpress"))
|
||||||
{
|
{
|
||||||
|
|
@ -74,60 +147,17 @@ namespace Microsoft.AspNetCore.Server.IntegrationTesting
|
||||||
port = (uri.Scheme == "https") ? TestPortHelper.GetNextSSLPort() : TestPortHelper.GetNextPort();
|
port = (uri.Scheme == "https") ? TestPortHelper.GetNextSSLPort() : TestPortHelper.GetNextPort();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Logger.LogInformation("Attempting to start IIS Express on port: {port}", port);
|
||||||
|
PrepareConfig(contentRoot, dllRoot, port);
|
||||||
|
|
||||||
|
var parameters = string.IsNullOrEmpty(DeploymentParameters.ServerConfigLocation) ?
|
||||||
|
string.Format("/port:{0} /path:\"{1}\" /trace:error", uri.Port, contentRoot) :
|
||||||
|
string.Format("/site:{0} /config:{1} /trace:error", DeploymentParameters.SiteName, DeploymentParameters.ServerConfigLocation);
|
||||||
|
|
||||||
|
var iisExpressPath = GetIISExpressPath();
|
||||||
|
|
||||||
for (var attempt = 0; attempt < MaximumAttempts; attempt++)
|
for (var attempt = 0; attempt < MaximumAttempts; attempt++)
|
||||||
{
|
{
|
||||||
Logger.LogInformation("Attempting to start IIS Express on port: {port}", port);
|
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(DeploymentParameters.ServerConfigTemplateContent))
|
|
||||||
{
|
|
||||||
var serverConfig = DeploymentParameters.ServerConfigTemplateContent;
|
|
||||||
|
|
||||||
// Pass on the applicationhost.config to iis express. With this don't need to pass in the /path /port switches as they are in the applicationHost.config
|
|
||||||
// We take a copy of the original specified applicationHost.Config to prevent modifying the one in the repo.
|
|
||||||
serverConfig = ModifyANCMPathInConfig(replaceFlag: "[ANCMPath]", dllName: "aspnetcore.dll", serverConfig, contentRoot);
|
|
||||||
|
|
||||||
serverConfig = ModifyANCMPathInConfig(replaceFlag: "[ANCMV2Path]", dllName: "aspnetcorev2.dll", serverConfig, contentRoot);
|
|
||||||
|
|
||||||
Logger.LogDebug("Writing ApplicationPhysicalPath '{applicationPhysicalPath}' to config", contentRoot);
|
|
||||||
Logger.LogDebug("Writing Port '{port}' to config", port);
|
|
||||||
serverConfig =
|
|
||||||
serverConfig
|
|
||||||
.Replace("[ApplicationPhysicalPath]", contentRoot)
|
|
||||||
.Replace("[PORT]", port.ToString());
|
|
||||||
|
|
||||||
DeploymentParameters.ServerConfigLocation = Path.GetTempFileName();
|
|
||||||
|
|
||||||
if (serverConfig.Contains("[HostingModel]"))
|
|
||||||
{
|
|
||||||
var hostingModel = DeploymentParameters.HostingModel.ToString();
|
|
||||||
serverConfig.Replace("[HostingModel]", hostingModel);
|
|
||||||
Logger.LogDebug("Writing HostingModel '{hostingModel}' to config", hostingModel);
|
|
||||||
}
|
|
||||||
|
|
||||||
Logger.LogDebug("Saving Config to {configPath}", DeploymentParameters.ServerConfigLocation);
|
|
||||||
|
|
||||||
if (Logger.IsEnabled(LogLevel.Trace))
|
|
||||||
{
|
|
||||||
Logger.LogTrace($"Config File Content:{Environment.NewLine}===START CONFIG==={Environment.NewLine}{{configContent}}{Environment.NewLine}===END CONFIG===", serverConfig);
|
|
||||||
}
|
|
||||||
|
|
||||||
File.WriteAllText(DeploymentParameters.ServerConfigLocation, serverConfig);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (DeploymentParameters.HostingModel == HostingModel.InProcess)
|
|
||||||
{
|
|
||||||
ModifyAspNetCoreSectionInWebConfig(key: "hostingModel", value: "inprocess");
|
|
||||||
}
|
|
||||||
|
|
||||||
ModifyHandlerSectionInWebConfig(key: "modules", value: DeploymentParameters.AncmVersion.ToString());
|
|
||||||
ModifyDotNetExePathInWebConfig();
|
|
||||||
|
|
||||||
var parameters = string.IsNullOrWhiteSpace(DeploymentParameters.ServerConfigLocation) ?
|
|
||||||
string.Format("/port:{0} /path:\"{1}\" /trace:error", uri.Port, contentRoot) :
|
|
||||||
string.Format("/site:{0} /config:{1} /trace:error", DeploymentParameters.SiteName, DeploymentParameters.ServerConfigLocation);
|
|
||||||
|
|
||||||
var iisExpressPath = GetIISExpressPath();
|
|
||||||
|
|
||||||
Logger.LogInformation("Executing command : {iisExpress} {parameters}", iisExpressPath, parameters);
|
Logger.LogInformation("Executing command : {iisExpress} {parameters}", iisExpressPath, parameters);
|
||||||
|
|
||||||
var startInfo = new ProcessStartInfo
|
var startInfo = new ProcessStartInfo
|
||||||
|
|
@ -197,7 +227,7 @@ namespace Microsoft.AspNetCore.Server.IntegrationTesting
|
||||||
// just in case we missed one -anurse
|
// just in case we missed one -anurse
|
||||||
if (!await started.Task.TimeoutAfter(TimeSpan.FromMinutes(10)))
|
if (!await started.Task.TimeoutAfter(TimeSpan.FromMinutes(10)))
|
||||||
{
|
{
|
||||||
Logger.LogInformation("iisexpress Process {pid} failed to bind to port {port}, trying again", _hostProcess.Id, port);
|
Logger.LogInformation("iisexpress Process {pid} failed to bind to port {port}, trying again", process.Id, port);
|
||||||
|
|
||||||
// Wait for the process to exit and try again
|
// Wait for the process to exit and try again
|
||||||
process.WaitForExit(30 * 1000);
|
process.WaitForExit(30 * 1000);
|
||||||
|
|
@ -217,15 +247,69 @@ namespace Microsoft.AspNetCore.Server.IntegrationTesting
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private string ModifyANCMPathInConfig(string replaceFlag, string dllName, string serverConfig, string contentRoot)
|
private void PrepareConfig(string contentRoot, string dllRoot, int port)
|
||||||
|
{
|
||||||
|
// Config is required. If not present then fall back to one we carry with us.
|
||||||
|
if (string.IsNullOrEmpty(DeploymentParameters.ServerConfigTemplateContent))
|
||||||
|
{
|
||||||
|
using (var stream = GetType().Assembly.GetManifestResourceStream("Microsoft.AspNetCore.Server.IntegrationTesting.Http.config"))
|
||||||
|
using (var reader = new StreamReader(stream))
|
||||||
|
{
|
||||||
|
DeploymentParameters.ServerConfigTemplateContent = reader.ReadToEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var serverConfig = DeploymentParameters.ServerConfigTemplateContent;
|
||||||
|
|
||||||
|
// Pass on the applicationhost.config to iis express. With this don't need to pass in the /path /port switches as they are in the applicationHost.config
|
||||||
|
// We take a copy of the original specified applicationHost.Config to prevent modifying the one in the repo.
|
||||||
|
serverConfig = ModifyANCMPathInConfig(replaceFlag: "[ANCMPath]", dllName: "aspnetcore.dll", serverConfig, dllRoot);
|
||||||
|
serverConfig = ModifyANCMPathInConfig(replaceFlag: "[ANCMV2Path]", dllName: "aspnetcorev2.dll", serverConfig, dllRoot);
|
||||||
|
|
||||||
|
serverConfig = ReplacePlaceholder(serverConfig, "[PORT]", port.ToString(CultureInfo.InvariantCulture));
|
||||||
|
serverConfig = ReplacePlaceholder(serverConfig, "[ApplicationPhysicalPath]", contentRoot);
|
||||||
|
|
||||||
|
if (DeploymentParameters.PublishApplicationBeforeDeployment)
|
||||||
|
{
|
||||||
|
// For published apps, prefer the content in the web.config, but update it.
|
||||||
|
ModifyAspNetCoreSectionInWebConfig(key: "hostingModel",
|
||||||
|
value: DeploymentParameters.HostingModel == HostingModel.InProcess ? "inprocess" : "");
|
||||||
|
ModifyHandlerSectionInWebConfig(key: "modules", value: DeploymentParameters.AncmVersion.ToString());
|
||||||
|
ModifyDotNetExePathInWebConfig();
|
||||||
|
serverConfig = RemoveRedundantElements(serverConfig);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// The elements normally in the web.config are in the applicationhost.config for unpublished apps.
|
||||||
|
serverConfig = ReplacePlaceholder(serverConfig, "[HostingModel]", DeploymentParameters.HostingModel.ToString());
|
||||||
|
serverConfig = ReplacePlaceholder(serverConfig, "[AspNetCoreModule]", DeploymentParameters.AncmVersion.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
DeploymentParameters.ServerConfigLocation = Path.GetTempFileName();
|
||||||
|
Logger.LogDebug("Saving Config to {configPath}", DeploymentParameters.ServerConfigLocation);
|
||||||
|
|
||||||
|
File.WriteAllText(DeploymentParameters.ServerConfigLocation, serverConfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
private string ReplacePlaceholder(string content, string field, string value)
|
||||||
|
{
|
||||||
|
if (content.Contains(field))
|
||||||
|
{
|
||||||
|
content = content.Replace(field, value);
|
||||||
|
Logger.LogDebug("Writing {field} '{value}' to config", field, value);
|
||||||
|
}
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string ModifyANCMPathInConfig(string replaceFlag, string dllName, string serverConfig, string dllRoot)
|
||||||
{
|
{
|
||||||
if (serverConfig.Contains(replaceFlag))
|
if (serverConfig.Contains(replaceFlag))
|
||||||
{
|
{
|
||||||
var arch = DeploymentParameters.RuntimeArchitecture == RuntimeArchitecture.x64 ? $@"x64\{dllName}" : $@"x86\{dllName}";
|
var arch = DeploymentParameters.RuntimeArchitecture == RuntimeArchitecture.x64 ? $@"x64\{dllName}" : $@"x86\{dllName}";
|
||||||
var ancmFile = Path.Combine(contentRoot, arch);
|
var ancmFile = Path.Combine(dllRoot, arch);
|
||||||
if (!File.Exists(Environment.ExpandEnvironmentVariables(ancmFile)))
|
if (!File.Exists(Environment.ExpandEnvironmentVariables(ancmFile)))
|
||||||
{
|
{
|
||||||
ancmFile = Path.Combine(contentRoot, dllName);
|
ancmFile = Path.Combine(dllRoot, dllName);
|
||||||
if (!File.Exists(Environment.ExpandEnvironmentVariables(ancmFile)))
|
if (!File.Exists(Environment.ExpandEnvironmentVariables(ancmFile)))
|
||||||
{
|
{
|
||||||
throw new FileNotFoundException("AspNetCoreModule could not be found.", ancmFile);
|
throw new FileNotFoundException("AspNetCoreModule could not be found.", ancmFile);
|
||||||
|
|
@ -263,7 +347,7 @@ namespace Microsoft.AspNetCore.Server.IntegrationTesting
|
||||||
{
|
{
|
||||||
ShutDownIfAnyHostProcess(_hostProcess);
|
ShutDownIfAnyHostProcess(_hostProcess);
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(DeploymentParameters.ServerConfigLocation)
|
if (!string.IsNullOrEmpty(DeploymentParameters.ServerConfigLocation)
|
||||||
&& File.Exists(DeploymentParameters.ServerConfigLocation))
|
&& File.Exists(DeploymentParameters.ServerConfigLocation))
|
||||||
{
|
{
|
||||||
// Delete the temp applicationHostConfig that we created.
|
// Delete the temp applicationHostConfig that we created.
|
||||||
|
|
@ -317,7 +401,7 @@ namespace Microsoft.AspNetCore.Server.IntegrationTesting
|
||||||
// Transforms the web.config file to set attributes like hostingModel="inprocess" element
|
// Transforms the web.config file to set attributes like hostingModel="inprocess" element
|
||||||
private void ModifyAspNetCoreSectionInWebConfig(string key, string value)
|
private void ModifyAspNetCoreSectionInWebConfig(string key, string value)
|
||||||
{
|
{
|
||||||
var webConfigFile = $"{DeploymentParameters.PublishedApplicationRootPath}/web.config";
|
var webConfigFile = Path.Combine(DeploymentParameters.PublishedApplicationRootPath, "web.config");
|
||||||
var config = XDocument.Load(webConfigFile);
|
var config = XDocument.Load(webConfigFile);
|
||||||
var element = config.Descendants("aspNetCore").FirstOrDefault();
|
var element = config.Descendants("aspNetCore").FirstOrDefault();
|
||||||
element.SetAttributeValue(key, value);
|
element.SetAttributeValue(key, value);
|
||||||
|
|
@ -326,11 +410,27 @@ namespace Microsoft.AspNetCore.Server.IntegrationTesting
|
||||||
|
|
||||||
private void ModifyHandlerSectionInWebConfig(string key, string value)
|
private void ModifyHandlerSectionInWebConfig(string key, string value)
|
||||||
{
|
{
|
||||||
var webConfigFile = $"{DeploymentParameters.PublishedApplicationRootPath}/web.config";
|
var webConfigFile = Path.Combine(DeploymentParameters.PublishedApplicationRootPath, "web.config");
|
||||||
var config = XDocument.Load(webConfigFile);
|
var config = XDocument.Load(webConfigFile);
|
||||||
var element = config.Descendants("handlers").FirstOrDefault().Descendants("add").FirstOrDefault();
|
var element = config.Descendants("handlers").FirstOrDefault().Descendants("add").FirstOrDefault();
|
||||||
element.SetAttributeValue(key, value);
|
element.SetAttributeValue(key, value);
|
||||||
config.Save(webConfigFile);
|
config.Save(webConfigFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// These elements are duplicated in the web.config if you publish. Remove them from the host.config.
|
||||||
|
private string RemoveRedundantElements(string serverConfig)
|
||||||
|
{
|
||||||
|
var hostConfig = XDocument.Parse(serverConfig);
|
||||||
|
|
||||||
|
var coreElement = hostConfig.Descendants("aspNetCore").FirstOrDefault();
|
||||||
|
coreElement?.Remove();
|
||||||
|
|
||||||
|
var handlersElement = hostConfig.Descendants("handlers").First();
|
||||||
|
var handlerElement = handlersElement.Descendants("add")
|
||||||
|
.Where(x => x.Attribute("name").Value == "aspNetCore").FirstOrDefault();
|
||||||
|
handlerElement?.Remove();
|
||||||
|
|
||||||
|
return hostConfig.ToString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -39,37 +39,37 @@ namespace Microsoft.AspNetCore.Server.IntegrationTesting
|
||||||
$" Supported server types are {nameof(ServerType.Kestrel)}, {nameof(ServerType.IIS)} and {nameof(ServerType.HttpSys)}");
|
$" Supported server types are {nameof(ServerType.Kestrel)}, {nameof(ServerType.IIS)} and {nameof(ServerType.HttpSys)}");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(_deploymentParameters.ServerName))
|
if (string.IsNullOrEmpty(_deploymentParameters.ServerName))
|
||||||
{
|
{
|
||||||
throw new ArgumentException($"Invalid value '{_deploymentParameters.ServerName}' for {nameof(RemoteWindowsDeploymentParameters.ServerName)}");
|
throw new ArgumentException($"Invalid value '{_deploymentParameters.ServerName}' for {nameof(RemoteWindowsDeploymentParameters.ServerName)}");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(_deploymentParameters.ServerAccountName))
|
if (string.IsNullOrEmpty(_deploymentParameters.ServerAccountName))
|
||||||
{
|
{
|
||||||
throw new ArgumentException($"Invalid value '{_deploymentParameters.ServerAccountName}' for {nameof(RemoteWindowsDeploymentParameters.ServerAccountName)}." +
|
throw new ArgumentException($"Invalid value '{_deploymentParameters.ServerAccountName}' for {nameof(RemoteWindowsDeploymentParameters.ServerAccountName)}." +
|
||||||
" Account credentials are required to enable creating a powershell session to the remote server.");
|
" Account credentials are required to enable creating a powershell session to the remote server.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(_deploymentParameters.ServerAccountPassword))
|
if (string.IsNullOrEmpty(_deploymentParameters.ServerAccountPassword))
|
||||||
{
|
{
|
||||||
throw new ArgumentException($"Invalid value '{_deploymentParameters.ServerAccountPassword}' for {nameof(RemoteWindowsDeploymentParameters.ServerAccountPassword)}." +
|
throw new ArgumentException($"Invalid value '{_deploymentParameters.ServerAccountPassword}' for {nameof(RemoteWindowsDeploymentParameters.ServerAccountPassword)}." +
|
||||||
" Account credentials are required to enable creating a powershell session to the remote server.");
|
" Account credentials are required to enable creating a powershell session to the remote server.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_deploymentParameters.ApplicationType == ApplicationType.Portable
|
if (_deploymentParameters.ApplicationType == ApplicationType.Portable
|
||||||
&& string.IsNullOrWhiteSpace(_deploymentParameters.DotnetRuntimePath))
|
&& string.IsNullOrEmpty(_deploymentParameters.DotnetRuntimePath))
|
||||||
{
|
{
|
||||||
throw new ArgumentException($"Invalid value '{_deploymentParameters.DotnetRuntimePath}' for {nameof(RemoteWindowsDeploymentParameters.DotnetRuntimePath)}. " +
|
throw new ArgumentException($"Invalid value '{_deploymentParameters.DotnetRuntimePath}' for {nameof(RemoteWindowsDeploymentParameters.DotnetRuntimePath)}. " +
|
||||||
"It must be non-empty for portable apps.");
|
"It must be non-empty for portable apps.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(_deploymentParameters.RemoteServerFileSharePath))
|
if (string.IsNullOrEmpty(_deploymentParameters.RemoteServerFileSharePath))
|
||||||
{
|
{
|
||||||
throw new ArgumentException($"Invalid value for {nameof(RemoteWindowsDeploymentParameters.RemoteServerFileSharePath)}." +
|
throw new ArgumentException($"Invalid value for {nameof(RemoteWindowsDeploymentParameters.RemoteServerFileSharePath)}." +
|
||||||
" . A file share is required to copy the application's published output.");
|
" . A file share is required to copy the application's published output.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(_deploymentParameters.ApplicationBaseUriHint))
|
if (string.IsNullOrEmpty(_deploymentParameters.ApplicationBaseUriHint))
|
||||||
{
|
{
|
||||||
throw new ArgumentException($"Invalid value for {nameof(RemoteWindowsDeploymentParameters.ApplicationBaseUriHint)}.");
|
throw new ArgumentException($"Invalid value for {nameof(RemoteWindowsDeploymentParameters.ApplicationBaseUriHint)}.");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -194,22 +194,6 @@ namespace Microsoft.AspNetCore.Server.IntegrationTesting
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetDotNetExeForArchitecture()
|
|
||||||
{
|
|
||||||
var executableName = DotnetCommandName;
|
|
||||||
// We expect x64 dotnet.exe to be on the path but we have to go searching for the x86 version.
|
|
||||||
if (DotNetCommands.IsRunningX86OnX64(DeploymentParameters.RuntimeArchitecture))
|
|
||||||
{
|
|
||||||
executableName = DotNetCommands.GetDotNetExecutable(DeploymentParameters.RuntimeArchitecture);
|
|
||||||
if (!File.Exists(executableName))
|
|
||||||
{
|
|
||||||
throw new Exception($"Unable to find '{executableName}'.'");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return executableName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Dispose()
|
public override void Dispose()
|
||||||
{
|
{
|
||||||
using (Logger.BeginScope("SelfHost.Dispose"))
|
using (Logger.BeginScope("SelfHost.Dispose"))
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -13,6 +13,10 @@
|
||||||
<EnableApiCheck>false</EnableApiCheck>
|
<EnableApiCheck>false</EnableApiCheck>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<EmbeddedResource Include="Http.config" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<EmbeddedResource Include="Deployers\RemoteWindowsDeployer\RemotePSSessionHelper.ps1;Deployers\RemoteWindowsDeployer\StartServer.ps1;Deployers\RemoteWindowsDeployer\StopServer.ps1" Exclude="bin\**;obj\**;**\*.xproj;packages\**;@(EmbeddedResource)" />
|
<EmbeddedResource Include="Deployers\RemoteWindowsDeployer\RemotePSSessionHelper.ps1;Deployers\RemoteWindowsDeployer\StartServer.ps1;Deployers\RemoteWindowsDeployer\StopServer.ps1" Exclude="bin\**;obj\**;**\*.xproj;packages\**;@(EmbeddedResource)" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
|
||||||
|
|
@ -305,7 +305,7 @@ namespace Microsoft.AspNetCore.Server.IntegrationTesting
|
||||||
if (hostingModel == HostingModel.InProcess)
|
if (hostingModel == HostingModel.InProcess)
|
||||||
{
|
{
|
||||||
// Not supported
|
// Not supported
|
||||||
if (Tfm.Matches(Tfm.Net461, tfm) || version == AncmVersion.AspNetCoreModule)
|
if (Tfm.Matches(Tfm.Net461, tfm) || Tfm.Matches(Tfm.NetCoreApp20, tfm) || version == AncmVersion.AspNetCoreModule)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue