筆者偶爾會接到需要在 WinForm 應用程式中提供 API 讓其他服務能夠呼叫的需求,以前處理起來很麻煩,要寫一堆繁瑣的程式,最近又有一個這樣的需求,剛好來試試看之前看到的 .NET 6 新推出的 Minimal API ,順便紀錄一下
先安裝 1 個 NuGet 套件:
Microsoft.AspNetCore.App
只要使用瀏覽器開啟 http://localhost:5000/ 就可以看到 Hello World!
註: new string[] { } 原本是用在 Program.cs 的 static void Main() 方法要增加 string[] args 參數傳入 Create 方法內,但是在 WinForm 中幾乎不會用到傳入參數的部分(除非使用指令視窗附加參數或是以此應用開啟檔案),所以在本教學中省略。
上面對應的連結分別為:
註:除了 MapGet 之外還可以使用 MapPost, MapPut, MapDelete, MapMethods 等
將原本的程式碼刪掉替換為下面的程式碼:
HomeController:
連結:
參考資料:
Minimal APIs overview
WebApplicationBuilder Class
WebApplication Class
WebApplication.CreateBuilder Method
先安裝 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
問一下 用這個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(); }