从 Windows 服务启动 ASP.NET Core API

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

我有一个小型 API,是根据 Visual Studio 22 中的 ASP.NET Core API 模板创建的,该模板面向 .NET6。 为了测试\调试,我使用控制台应用程序启动 API,一切正常。 但对于生产,我需要从 Windows 服务启动此 API,但我不知道如何制作它。

我可以简单地将 .exe 放在与服务相同的文件夹中并调用它,但就我现在而言,如果没有用户登录控制台应用程序将无法启动。 所以想法是将API与所有服务打包在一起,并在windows服务启动时启动它。

我做了一个小测试,使用名为“Start”的方法创建一个静态类名“Test.cs”,并从“Program.cs”复制所有代码并从测试应用程序调用“Start”方法。 API 启动并持续侦听端点,但由于某种原因没有映射项目控制器文件夹中的控制器。

all OK when starting API from default

controllers not mapped when start API from static method

程序.cs

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();


//to avoid json serialize camel casing


builder.Services.AddControllers().AddJsonOptions(opts => 
{ 
    opts.JsonSerializerOptions.PropertyNamingPolicy = null;
    opts.JsonSerializerOptions.NumberHandling = System.Text.Json.Serialization.JsonNumberHandling.AllowNamedFloatingPointLiterals; //para aceitar NAN, infinitos etc no json
});
//////////


//Nedeed
builder.Services.AddCors(options =>
{
    options.AddPolicy("CorsPolicy", builder => builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
});



var app = builder.Build();


// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();
app.UseCors("CorsPolicy");

//app.UseAuthorization();

app.MapControllers();

app.Run();

测试.cs

namespace ProjectX.Api
{
    public static class Test
    {

        public static void Start()
        {
            var builder = WebApplication.CreateBuilder();

            // Add services to the container.

            builder.Services.AddControllers();
            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen();


            //to avoid json serialize camel casing


            builder.Services.AddControllers().AddJsonOptions(opts =>
            {
                opts.JsonSerializerOptions.PropertyNamingPolicy = null;
                opts.JsonSerializerOptions.NumberHandling = System.Text.Json.Serialization.JsonNumberHandling.AllowNamedFloatingPointLiterals; //para aceitar NAN, infinitos etc no json
            });
            //////////


            //Nedeed
            builder.Services.AddCors(options =>
            {
                options.AddPolicy("CorsPolicy", builder => builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
            });



            var app = builder.Build();



            app.UseSwagger();
            app.UseSwaggerUI();

            app.UseHttpsRedirection();
            app.UseCors("CorsPolicy");

            //app.UseAuthorization();

            app.MapControllers();


            app.Run();

        }


    }
}

测试应用程序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace ProjectX.Tester
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            try
            {

                ProjectX.Api.Test.Start();
            }
            catch (Exception ex )
            {


            }
        }
    }
}
asp.net .net asp.net-core controller asp.net-core-webapi
1个回答
0
投票

您可以直接在

exe
中运行Web Api的
Start()
文件:

public static void Start()
{
    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.CreateNoWindow = false;
    startInfo.UseShellExecute = false;
    startInfo.FileName = "Your Path\\ProjectName.exe";
    startInfo.WindowStyle = ProcessWindowStyle.Normal;
    startInfo.Arguments = "";
    try
    {
        using (Process exeProcess = Process.Start(startInfo))
        {
            exeProcess.WaitForExit();
        }
    }
    catch
    {
        //Log error.
    }
}

然后就可以成功调用项目中的API了:

如果要应用Swagger,请在

Program.cs
中的生产环境添加以下代码:

app.UseSwagger();
app.UseSwaggerUI();

结果:

希望这可以帮助你。

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