Hosting ASP.NET Core API in a Windows Forms Application

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:

  1. Create a Windows Forms Application name it MyWinFormsApp

  2. Open Form1 in design mode and drop a TextBox on it.

  3. Change the Modifiers property of the textBox1 in designer to Public and save it.

  4. Install Microsoft.AspNetCore.Mvc package

  5. Install Microsoft.AspNetCore package

  6. 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();
             }
         }
     }
    
  7. 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>();
         }
     }
    
  8. Create a folder called Controllers in the root of the project.

  9. Create ValuesController.cs in the Controllers 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();
             }
         }
     }
    
  10. Run the application.

  11. Type “hi” in the textBox1

  12. Open browser and browse http://localhost:5000/api/values → You will see hi as response.

  13. http://localhost:5000/api/values/bye → You will see bye in textBox1

Further Reading

You may also be interested in How to use Dependency Injection (DI) in Windows Forms (WinForms)

Leave a Comment