Hosting ASP.NET CORE API in a Windows Forms Application and Interaction with Form
Here is a basic step by step example about how to create a project to host ASP.NET CORE API inside a Windows Forms Application and perform some interaction with Form.
To do so, follow these steps:
-
Create a Windows Forms Application name it
MyWinFormsApp
-
Open
Form1
in design mode and drop aTextBox
on it. -
Change the
Modifiers
property of thetextBox1
in designer toPublic
and save it. -
Install
Microsoft.AspNetCore.Mvc
package -
Install
Microsoft.AspNetCore
package -
Create a
Startup.cs
file in the root of the project, and copy the following code:using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; namespace MyWinFormsApp { public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseMvc(); } } }
-
Copy the following code in
Program.cs
:using System; using System.Threading; using System.Windows.Forms; using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; namespace MyWinFormsApp { public class Program { public static Form1 MainForm { get; private set; } [STAThread] public static void Main(string[] args) { CreateWebHostBuilder(args).Build().RunAsync(); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); MainForm = new Form1(); Application.Run(MainForm); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>(); } }
-
Create a folder called
Controllers
in the root of the project. -
Create
ValuesController.cs
in theControllers
folder and copy the following code to file:using System; using Microsoft.AspNetCore.Mvc; namespace MyWinFormsApp.Controllers { [Route("api/[controller]")] [ApiController] public class ValuesController : ControllerBase { [HttpGet] public ActionResult<string> Get() { string text = ""; Program.MainForm.Invoke(new Action(() => { text = Program.MainForm.textBox1.Text; })); return text; } [HttpGet("{id}")] public ActionResult Get(string id) { Program.MainForm.Invoke(new Action(() => { Program.MainForm.textBox1.Text = id; })); return Ok(); } } }
-
Run the application.
-
Type “hi” in the
textBox1
-
Open browser and browse http://localhost:5000/api/values → You will see
hi
as response. -
http://localhost:5000/api/values/bye → You will see
bye
intextBox1
Further Reading
You may also be interested in How to use Dependency Injection (DI) in Windows Forms (WinForms)