我制作了一个简单的.NET 6 Web API。从Visual Studio运行时(只需按F5键(,此操作效果良好。然而,当将我的应用程序作为一个自包含的服务运行时,对于本应成功的调用,我会得到404。如何确保我的自包含服务开始表现相同?
这是我的Program.json
using Microsoft.Extensions.Hosting.WindowsServices;
var options = new WebApplicationOptions
{
Args = args,
ContentRootPath = WindowsServiceHelpers.IsWindowsService() ? AppContext.BaseDirectory : default
};
var builder = WebApplication.CreateBuilder(options);
builder.Services.AddRazorPages();
builder.Host.UseWindowsService();
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.MapControllers();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
//app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); });
await app.RunAsync();
这是我的csproj
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<UserSecretsId>XXXXX-78E75397-5A01-4397-9481-E423B4BF54C2</UserSecretsId>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.0" />
</ItemGroup>
</Project>
这就是我测试的方式:
- 打开解决方案文件,然后按F5
- 从包含csproj的文件夹中运行
dotnet publish --no-build -c Release
。这会在XXXXXbinReleasenet6.0win-x64
中生成一个exe,所以我通过从命令提示符转到该文件夹来运行该文件夹中的exe,然后运行该exe
在这两种情况下,我都使用curl -I http://localhost:5000/swagger/index.html
进行测试。
当执行选项2(使用dotnet publish
(时,返回404。在视觉工作室跑步时,我只得到200分。
如何确保dotnet publish
的结果与从Visual Studio运行时我的应用程序的行为相同?
在这两种情况下,服务都是自托管的。另一种选择是使用IIS。
Swagger被禁用的原因是代码只在开发环境中显式地启用它。
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
环境由ASPNETCORE_ENVIRONMENT
环境变量的值控制。除非您在用户或系统的环境变量中明确设置该环境变量,否则它将不存在,并且您的服务将以Production
模式运行。
Shell脚本通常在执行依赖于环境变量的程序之前设置环境变量。Visual Studio在启动程序之前设置launchsettings.json
中指定的环境变量。如果你试图在VS之外运行程序,你必须自己设置,例如:
SET ASPNETCORE_ENVIRONMENT=Development
myservice.exe
launchsettings.json用于指定启动配置文件,而不仅仅是环境变量。这包括宿主模型、命令行参数等。通常,它由像Visual Studio这样的IDE使用,但您也可以使用--launch-profile <NAME>
选项的特定配置文件启动带有dotnet运行的.NET程序
文档解释说,这个文件没有部署,所以它从未出现在publish
文件夹中:
launchSettings.json文件:
- 仅在本地开发机器上使用
- 未部署
- 包含配置文件设置