Skip to content

Conversation

Copy link
Contributor

Copilot AI commented Jan 6, 2026

Add .slnx fallback for TestHost content root discovery

  • You've read the Contributor Guide and Code of Conduct.
  • You've included unit or integration tests for your change, where applicable.
  • You've included inline docs for your change, where applicable.
  • There's an open issue for the PR that you are making. If you'd like to propose a new feature or change, please open an issue to discuss the change or find an existing issue.

Summary of the changes (Less than 80 chars)

  • Add non-breaking .slnx fallback for content root lookup.

Description

Problem: UseSolutionRelativeContentRoot threw when only a .slnx existed, and .slnx could shadow .sln in parents.
Changes:

  • Keep .sln precedence; if none found, retry search for .slnx without changing API.
  • Added focused tests validating .sln preference and .slnx fallback discovery.

Example:

new WebHostBuilder()
    .UseSolutionRelativeContentRoot("src/MyApp", appBasePath, "*.sln"); // now falls back to slnx if no sln
Original prompt

Create a variant of #61305 that contains no breaking API changes. It should also avoid the behavioral breaking change when you could technically have a .slnx file that then "shadows" a .sln file in a parent folder. The only behavioral change is that it should not throw the InvalidOperationException from https://github.com/dotnet/aspnetcore/blob/release/9.0/src/Hosting/TestHost/src/WebHostBuilderExtensions.cs#L166 if there was an "*.slnx" file.


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

@dotnet-policy-service dotnet-policy-service bot added this to the 9.0.x milestone Jan 6, 2026
@dotnet-policy-service
Copy link
Contributor

Hi @@copilot. If this is not a tell-mode PR, please make sure to follow the instructions laid out in the servicing process document.
Otherwise, please add tell-mode label.

Copilot AI changed the title [WIP] Update WebHostBuilderExtensions to avoid exception with .slnx file Add .slnx fallback for TestHost content root discovery Jan 6, 2026
Copilot AI requested a review from halter73 January 6, 2026 23:40
@halter73 halter73 marked this pull request as ready for review January 8, 2026 16:49
Copilot AI review requested due to automatic review settings January 8, 2026 16:49
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This pull request adds non-breaking .slnx fallback support to the UseSolutionRelativeContentRoot method in TestHost. When searching for solution files with the "*.sln" pattern, the method now falls back to searching for .slnx files if no .sln file is found, preventing the InvalidOperationException that would previously occur.

Key changes:

  • Added .slnx fallback logic that only activates when no .sln file is found and the search pattern is "*.sln"
  • Maintained .sln precedence to avoid breaking changes where .slnx files could shadow .sln files in parent directories
  • Added comprehensive tests validating both the fallback behavior and .sln precedence

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

File Description
src/Hosting/TestHost/src/WebHostBuilderExtensions.cs Added conditional .slnx fallback logic after .sln search fails, maintaining backward compatibility
src/Hosting/TestHost/test/WebHostBuilderExtensionsTests.cs New test file with two tests: one verifying .slnx fallback and one verifying .sln takes precedence over .slnx

Comment on lines +166 to +181
if (string.Equals(solutionName, "*.sln", StringComparison.OrdinalIgnoreCase))
{
directoryInfo = new DirectoryInfo(applicationBasePath);
do
{
var solutionPath = Directory.EnumerateFiles(directoryInfo.FullName, "*.slnx").FirstOrDefault();
if (solutionPath != null)
{
builder.UseContentRoot(Path.GetFullPath(Path.Combine(directoryInfo.FullName, solutionRelativePath)));
return builder;
}

directoryInfo = directoryInfo.Parent;
}
while (directoryInfo is not null);
}
Copy link

Copilot AI Jan 8, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new fallback logic lacks test coverage for the exception case where neither a .sln nor .slnx file is found. Consider adding a test that verifies an InvalidOperationException is thrown with the expected error message when no solution file exists in the directory hierarchy.

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants