如何自托管 .NET WebAPI 控制台应用?

How to Self Host a .NET WebAPI Console App?

提问人:Nick Hudson 提问时间:11/15/2023 更新时间:11/15/2023 访问量:58

问:

我正在尝试创建一个简单的控制台应用程序,该应用程序充当本地主机服务器。此应用的重点是与另一个 .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 循环中。

C# asp.net ASP.NET-Web-API

评论

0赞 madreflection 11/15/2023
“奇怪的 POST 循环”部分应该是一个单独的帖子;每个帖子一个问题。您应该删除该部分,这样它就不会因需要更多注意力而关闭。
0赞 Ibram Reda 11/15/2023
类似的问题并查看文档 为 ASP.NET Core Kestrel Web 服务器配置终结点
0赞 Nick Hudson 11/15/2023
@madreflection “奇怪的 POST 循环”是应用程序未正确托管的结果。这就是为什么它不需要单独的线程。我只是在解释,在当前状态下,事情不起作用。
0赞 GH DevOps 11/15/2023
我认为launchsettings.json仅用于本地开发
0赞 madreflection 11/15/2023
@NickHudson:如果它相关,则您没有提供足够的信息来确认它确实是原因的一部分(而不仅仅是症状),并使用该信息来解决托管问题。如果您不需要提供更多信息来解决托管问题,那么它就是噪音,应该将其删除。

答:

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();