WebApplicationBuilder: Что запускает launchUrl для фактического запуска браузера?C#

Место общения программистов C#
Ответить
Anonymous
 WebApplicationBuilder: Что запускает launchUrl для фактического запуска браузера?

Сообщение Anonymous »

После обновления до .NET 10 launchUrl и launchBrowser в appsettings.json перестали работать под Kestrel. Обновление до .NET 10 — это большое изменение, поскольку IStartup необходимо заменить, и я вполне уверен, что что-то сломало launchUrl при преобразовании.
Чтобы внести ясность:
Это работает:

Код: Выделить всё

    "IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
Это не так:

Код: Выделить всё

    "http": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
Режим сбоя: приложение работает и прослушивает, но браузер так и не открывается. Если браузер открыт вручную и указан на веб-приложение, все работает.
Код запуска:

Код: Выделить всё

        System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
//Snip irrelevant
var config = CreateSettings(out var sources);
//Snip irrelevant
var builder = WebApplication.CreateEmptyBuilder(new WebApplicationOptions { ApplicationName = AppName, Args = args });
builder.Configuration.SetBasePath(Directory.GetCurrentDirectory());
builder.Configuration.Sources.AddRange(sources);
builder.Configuration.AddEnvironmentVariables();

builder.WebHost
.UseKestrel(options =>
{
// Snip loading production port config
// Looks essentially like this:
// if (port > 0)
//      options.Listen(System.Net.IPAddress.Loopback, port);
// but port is 0 in developer environment
options.AllowSynchronousIO = true;
})
.UseContentRoot(Directory.GetCurrentDirectory())
.ConfigureLogging((logging) =>
{
logging.SetMinimumLevel(config.LogLevel);
logging.ClearProviders();
logging.AddConsole();
#if DEBUG
logging.AddDebug();
#endif
})
.UseIISIntegration()
.UseIIS() // Enables use of IIS in the case of IIS launch; does not force IIS.
.ConfigureServices((services) =>
{
Startup.ConfigureServices(services, config, builder.Environment);
});

builder.WebHost
.UseSetting(WebHostDefaults.ApplicationKey, AppName);

var app = builder.Build();
Startup.Configure(app, app.Environment, config);
app.Run();
Содержимое Startup.Configure такое же, как код .NET 9 с использованием IStartup.
Практически идентичный рабочий код запуска:

Код: Выделить всё

        var builder = WebApplication.CreateEmptyBuilder(new WebApplicationOptions { ApplicationName = AppName, Args = args });
builder.Configuration.SetBasePath(Directory.GetCurrentDirectory());
builder.Configuration.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
builder.Configuration.AddJsonFile("devsettings.json", optional: true, reloadOnChange: true);
builder.Configuration.AddEnvironmentVariables();
builder.WebHost
.UseKestrel(options =>
{
// Trim rading config file.
System.Net.IPAddress bindto;
Action https =
listenOptions => {
if (!string.IsNullOrEmpty(certificate))
listenOptions.UseHttps(certificate, certificatepw);
// force http 1 to avoid the http2 cipher suite black list
// https://github.com/aspnet/AspNetCore/issues/14350
// https://tools.ietf.org/html/rfc7540#appendix-A
if (forcehttp1)
listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http1;
};
options.Listen(bindto, httpsport, https);
})
.ConfigureLogging((logging) =>
{
logging.ClearProviders();
logging.AddConsole();
#if DEBUG
logging.AddDebug();
#endif
})
.UseIISIntegration()
.UseIIS() // Enables use of IIS in the case of IIS launch; does not force IIS.
.ConfigureServices((services) =>
{
// It looks like you can do this but you can't.
// services.AddCors(options => options.AddPolicy("AllowAll", p => p.AllowAnyOrigin().AllowCredentials()));
// The CORS protocol does not allow specifying a wildcard (any) origin and credentials at the same time.  Configure the CORS policy by listing individual origins if credentials needs to be supported.
// But you can say it the long way.
services.AddCors((options) =>
options.AddPolicy("Enable", (builder) =>
builder.SetIsOriginAllowed(_ => true)
.WithMethods("GET")
.AllowAnyHeader()
.AllowCredentials())
);
services.AddRouting();
})
.UseSetting(WebHostDefaults.ApplicationKey, AppName);

var app = builder.Build();
app.UseCors();
// Trim MapGet()
app.Run();
Гипотезы:
  • явный вызов прослушивания имеет значение. Результат: false
  • вызов AddJsonFile имеет значение. Результат: false
  • logging.SetMinimumLevel имеет значение. Результат: ложь
Дополнительная информация: фактическое изменение, вызывающее срабатывание, было не изменением WebHostBuilder и не обновлением .NET 10. Мне пришлось вернуться к ветке .NET 9, которая все еще использует старый сборщик, и проблема повторилась для этого проекта. Это означает, что версия Visual Studio играет роль. Если бы у меня не было почти идентичной демо-версии рабочего кода, я бы сказал, что в Visual Studio он просто не работает.

Подробнее здесь: https://stackoverflow.com/questions/798 ... he-browser
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»