最簡單在 WinForm 上快速建立 API Server 教學 (Minimal API)

筆者偶爾會接到需要在 WinForm 應用程式中提供 API 讓其他服務能夠呼叫的需求,以前處理起來很麻煩,要寫一堆繁瑣的程式,最近又有一個這樣的需求,剛好來試試看之前看到的 .NET 6 新推出的 Minimal API ,順便紀錄一下

先安裝 1 個 NuGet 套件:
Microsoft.AspNetCore.App
    
dotnet add package Microsoft.AspNetCore.App --version 2.2.8
    

最簡單 API:

只要三行:
    
        Microsoft.AspNetCore.Builder.WebApplication app = Microsoft.AspNetCore.Builder.WebApplication.Create(new string[] { });
        app.MapGet("/", () => "Hello World!");
        app.RunAsync();
    

只要使用瀏覽器開啟 http://localhost:5000/ 就可以看到 Hello World!

註: new string[] { } 原本是用在 Program.cs 的 static void Main() 方法要增加 string[] args 參數傳入 Create 方法內,但是在 WinForm 中幾乎不會用到傳入參數的部分(除非使用指令視窗附加參數或是以此應用開啟檔案),所以在本教學中省略。

手動指定 port

網址變為 http://localhost:8080/
    
        app.Urls.Add("http://0.0.0.0:8080");
    

重定向

    
app.MapGet("/ruyut", () => Results.Redirect("https://www.ruyut.com"));
    

簡易使用示範

    
        Microsoft.AspNetCore.Builder.WebApplication app = Microsoft.AspNetCore.Builder.WebApplication.Create(null);
        app.MapGet("/", () => "Hello World!");
        app.MapGet("/user/{id}", (int id) => $"user id is {id}");
        app.MapGet("/add", ([FromQuery(Name = "a")] int a,[FromQuery(Name = "b")] int b) => $"{a} + {b} = {a + b}");
        app.RunAsync();
    

上面對應的連結分別為:
    
http://localhost:5000/
http://localhost:5000/user/10
http://localhost:5000/add?a=1&b=2
    


註:除了 MapGet 之外還可以使用 MapPost, MapPut, MapDelete, MapMethods 等

使用 Controller 類別

因為我們是寫在 WinForm 內,沒有一定要全部寫在一起,只要使用下面的程式碼就可以和平時寫 ASP.NET Core 一樣拆分使用 Controller

將原本的程式碼刪掉替換為下面的程式碼:
    
        var builder = Microsoft.AspNetCore.Builder.WebApplication.CreateBuilder(new string[]{});
        builder.Services.AddControllers();
        
        var app = builder.Build();
        app.MapControllers();
        app.RunAsync();
    

HomeController:
    
using Microsoft.AspNetCore.Mvc;

namespace RuyutWinFormsApi;

[Route("api/[controller]")]
[ApiController]
public class HomeController : ControllerBase
{
    [HttpGet]
    public IActionResult Get()
    {
        return Ok("This is a test api");
    }
}
    

連結:
    
http://localhost:5000/api/home
    



參考資料:
Minimal APIs overview
WebApplicationBuilder Class
WebApplication Class
WebApplication.CreateBuilder Method

留言

  1. 問一下 用這個API的方始開啟後 WPF用Caliburn.Micro 這個框架 我的controller要怎使用MainViewModel的function 因為查資料後寫成這樣
    MainViewModel mainViewModel = IoC.Get();
    mainViewModel.PlayEmergency();
    但會發生 他是new一個新的實例去call function 而我想要用原本開啟程式後實例去call
    bootstrap.cs
    private readonly SimpleContainer _container = new SimpleContainer();
    protected override void Configure()
    {
    _container.Singleton();
    _container.Singleton();
    }

    protected override void OnStartup(object sender, StartupEventArgs e){ DisplayRootViewForAsync(); }

    回覆刪除

張貼留言

如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com