提问人:Nick Hudson 提问时间:11/15/2023 更新时间:11/15/2023 访问量:58
如何自托管 .NET WebAPI 控制台应用?
How to Self Host a .NET WebAPI Console App?
问:
我正在尝试创建一个简单的控制台应用程序,该应用程序充当本地主机服务器。此应用的重点是与另一个 .net 应用进行通信。
我已成功创建该应用程序,并且可以在 Visual Studio 中正常运行它。但是,当我尝试从控制台或其他 .net 应用程序(使用 Process.Start)运行应用程序时。它没有按预期工作。
据我了解,这是因为它需要自托管?
我用于创建 webapi 应用的教程在这里。所以我的 Program.cs 看起来像这样:
static void Main(string[] args)
{
Console.WriteLine("Starting program");
SetupHostAndServices();
}
private async static void SetupHostAndServices()
{
var host = CreateHostBuilder().Build();
host.Run();
Console.ReadLine();
}
public static IHostBuilder CreateHostBuilder()
{
return Host.CreateDefaultBuilder()
.ConfigureWebHostDefaults(webHost =>
{
webHost.UseStartup<Startup>();
}).ConfigureServices(services =>
{
});
}
要从我的其他应用程序启动 webapi 控制台应用程序,我正在这样做:
System.Diagnostics.ProcessStartInfo StartInfo = new System.Diagnostics.ProcessStartInfo
{
FileName = GetServicePath(type),
Arguments = args,
UseShellExecute = true,
RedirectStandardOutput = false,
};
System.Diagnostics.Process process = new System.Diagnostics.Process
{
StartInfo = StartInfo,
};
process.Start();
当控制台应用启动时,它的执行与在 Visual Studio 中的执行方式不同。例如,它正在侦听端口 5000,这不是我在 LaunchSettings.json 文件中定义的端口。它似乎也陷入了一个奇怪的 POST 循环中。
答:
0赞
Nick Hudson
11/15/2023
#1
最终使用 Kestel 进行自托管。我的主机构建器现在如下所示:
var builder = WebHost.CreateDefaultBuilder();
var app = builder
.UseKestrel(options => options.Listen(IPAddress.Parse("127.0.0.1"), 60676))
.UseContentRoot(Directory.GetCurrentDirectory())
.UseWebRoot(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot"))
.Configure(app =>
{
app.UseStaticFiles(new StaticFileOptions()
{
FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot")),
RequestPath = "/"
});
}).UseStartup<Startup>().Build();
app.Run();
评论