.Net 6.0 项目中的自托管 Asp.net Web API

Self-host Asp.net Web API in .Net 6.0 project

我想将一个简单的 Web API 添加到现有的 .net 后端进程。该项目已经更新到 .net 6.0,我想保持在 6.0。我不知道如何向我的项目添加正确的引用以便能够在我的进程中自行托管 Web api。

目标是让一个可执行文件(大部分)复制到一个小型嵌入式 linux 系统,在该系统中有后端和网络服务器(提供静态文件并充当所服务前端的后端) .

'old' 教程 (.net 5.0) 建议添加对 nuget 包“Microsoft.AspNet.WebApi.OwinSelfHost”的引用,但似乎该包没有转换到 6.0。 (我在安装它时遇到错误,抱怨目标框架不受支持)

您可以在 .Net6 中使用 Microsoft.AspNetCore.Owin

测试结果


Program.cs

using Microsoft.AspNetCore.Hosting;

namespace selfhost
{
    class Program
    {
        static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseUrls("http://*:5000")
                .UseStartup<Startup>()
                .Build();

            host.Run();
        }
    }
}

Startup.cs

using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace selfhost
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
        }

        public void Configure(IApplicationBuilder app)
        {
            app.UseRouting();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}

控制器文件

using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace selfhost.Controller
{
    public class SayHiController : ControllerBase
    {
        [Route("sayhi/{name}")]
        public IActionResult Get(string name)
        {
            return Ok($"Hello {name}");
        }
        [Route("getguid")]
        public IActionResult GetGuid(string name)
        {
            return Ok($"{Guid.NewGuid().ToString()}");
        }
    }
}

我认为你应该能够通过 WebHost.UseKestrel 方法在没有 owin nuget 的情况下做到这一点

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllers();

builder.WebHost.UseKestrel(x =>
    x.ListenAnyIP(6969)
);

var app = builder.Build();

// Configure the HTTP request pipeline.
app.UseAuthorization();

app.MapControllers();

app.Run();

查看相关回答