嗨,我将简要解释一下我想要做什么。
所以基本上我有一个 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
这是我的程序.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();
我不知道还能做什么。
注意:
有趣的是,当我正常运行它(而不是作为服务)时,它工作得很好。
嗨,经过大量研究但没有结果,我终于找到了这个问题的解决方案。
首先我指定了指定服务名称时要使用哪个名称:
builder.Host.UseWindowsService();
builder.Services.AddWindowsService(options =>
{
options.ServiceName = "hereGoesYourServiceName";
});
基本上,当我们使用指定名称创建 Windows 服务时,我们的应用程序将识别系统中的该服务。
其次,我在 appsettings.json 中对 Kestrel 进行了微小的更改(您可以看到我旧的 Kestrel 设置),所以现在看起来像这样:
"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 可信证书,否则在将应用程序部署到生产环境时,它会生成一条警告,告诉您该站点不受信任),然后在服务器中创建服务。
欲了解更多详情,您可以使用此答案作为参考: