“未处理的异常:无法在 .NET Core 6.0 中配置 HTTPS 端点

问题描述 投票:0回答:1

嗨,我将简要解释一下我想要做什么。

所以基本上我有一个 blazor 项目,我发布了它并将其放在一个文件夹中,这个项目不是托管在 IIS 中,因为该项目在服务器中运行一些进程,所以我要做的就是运行 .exe 将其作为 kestrel 运行。因此,我的任务是创建一个 Windows 服务,以便 kestrel 可以在每次服务器启动或重新启动时自动运行,但我遇到了问题。

问题:
我使用此命令创建了服务

sc 创建 binPath="C:\inetpub\wwwroot\XXXXX\XXXXX.exe"

正如您所看到的,它指向 .exe,但是当我尝试运行该服务时,我在事件查看器中收到此错误

应用程序:XXXXX.exe CoreCLR版本:6.0.2123.36311 .NET版本:6.0.21 描述:由于未处理的异常,进程被终止。 异常信息:System.InvalidOperationException:无法配置 HTTPS 端点。未指定服务器证书,默认开发者证书找不到或已过期。 要生成开发人员证书,请运行“dotnet dev-certs https”。要信任证书(仅限 Windows 和 macOS),请运行“dotnet dev-certs https --trust”。 有关配置 HTTPS 的更多信息,请参阅 https://go.microsoft.com/fwlink/?linkid=848054。 在 Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.Reload() 在 Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.Load() 在 Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.BindAsync(CancellationToken CancellationToken) 在 Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.StartAsync[TContext](IHttpApplication`1 应用程序,CancellationToken CancellationToken) 在 Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken CancellationToken) 在 Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken CancellationToken) 在 Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost 主机,CancellationToken 令牌) 在 Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost 主机,CancellationToken 令牌) 在 Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost 主机) 在 Microsoft.AspNetCore.Builder.WebApplication.Run(字符串 url) 在 D:\XXXXX\XXXXX\source 中的 Program.$(String[] args) epos\XXXXX\XXXXX\Program.cs:第 55 行

我尝试过的:
我运行了这些命令,但仍然遇到相同的错误。
dotnet dev-certs https --clean
dotnet dev-certs https --trust

我的红隼端点在我的 appsettings.json

这是我的程序.cs

    var builder = WebApplication.CreateBuilder(new WebApplicationOptions()
{
    ContentRootPath = WindowsServiceHelpers.IsWindowsService() ? AppContext.BaseDirectory : default,
    Args = args
});

// Add services to the container.
builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
   .AddNegotiate();

builder.Services.AddAuthorization(options =>
{
    // By default, all incoming requests will be authorized according to the default policy.
    options.FallbackPolicy = options.DefaultPolicy;
});

builder.Services.AddRazorPages();
builder.Host.UseWindowsService();
builder.Services.AddServerSideBlazor();
builder.Services.TryAddTransient<IExcelReader, ExcelReader>();
builder.Services.TryAddSingleton<IXMLService, XMLService>();
builder.Services.TryAddSingleton<ICommandPromptService, CommandPromptService>();
builder.Services.TryAddSingleton<IGRLoaderService, GRLoaderService>();
builder.Services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

app.Run();

我不知道还能做什么。

注意:
有趣的是,当我正常运行它(而不是作为服务)时,它工作得很好。

c# .net asp.net-core blazor kestrel-http-server
1个回答
0
投票

嗨,经过大量研究但没有结果,我终于找到了这个问题的解决方案。

首先我指定了指定服务名称时要使用哪个名称:

builder.Host.UseWindowsService();
builder.Services.AddWindowsService(options =>
{
    options.ServiceName = "hereGoesYourServiceName";
});

基本上,当我们使用指定名称创建 Windows 服务时,我们的应用程序将识别系统中的该服务。

其次,我在 appsettings.json 中对 Kestrel 进行了微小的更改(您可以看到我旧的 Kestrel 设置here),所以现在看起来像这样:

"Kestrel": {
  "Endpoints": {
    "Http": {
      "Url": "http://path:port"
    },
    "HttpsInlineCertFile": {
      "Url": "https://path:port",
      "Certificate": {
        "Path": "pathToCert",
        "Password": "yourPwd"
      }
    }
  }
}

第三,我将这行代码添加到我的 Program.cs 中

builder.WebHost.UseKestrel((context, serverOptions) =>
{
    serverOptions.Configure(context.Configuration.GetSection("Kestrel"))
    .Endpoint("HTTPS", listenOptions =>
    {
        listenOptions.HttpsOptions.SslProtocols = SslProtocols.Tls12;
    });
});

因此这指定了应用程序将使用哪个端点。

第四,我添加了最后一行代码(在 Program.cs 的顶部)

var webApplicationOptions = new WebApplicationOptions() 
{
    Args = args,
    ContentRootPath = AppContext.BaseDirectory,
    ApplicationName = System.Diagnostics.Process.GetCurrentProcess().ProcessName
};

之后,我继续在服务器中发布我的应用程序,然后生成一个自签名证书(强烈建议使用 CA 可信证书,否则在将应用程序部署到生产环境时,它会生成一条警告,告诉您该站点不受信任),然后在服务器中创建服务。

欲了解更多详情,您可以使用此答案作为参考:

使用 https 让 Blazor WebAssembly 服务器作为 Windows 服务运行

© www.soinside.com 2019 - 2024. All rights reserved.