Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hosting ASP.NET Core API in a Windows Forms Application

Background: I am working on a project that involves a WinForms app. The client wants to expose a local-only HTTP server to allow other apps to trigger functionality on a running instance of the WinForms app via a REST API (or similar). The preference is to implement the aforementioned API using ASP.NET Core.

My question is thus: How do I structure a project to have both an ASP.NET Core API and a WinForms GUI in the same process? Are there any pitfalls I'd have to be wary of?

like image 242
Matthew King Avatar asked Feb 03 '20 05:02

Matthew King


People also ask

Does .NET Core support Windows form?

Windows Forms support was added to . NET Core in version 3.0.

Can I use web API in Windows application?

Here, we will be talking about an example to create a Web API and call it, using a desktop client application. Start Visual Studio and go to File -> New -> Project. In the template panel select Installed -> Templates -> Visual C# -> Web -> ASP.NET Web Application.


1 Answers

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)

like image 69
Reza Aghaei Avatar answered Sep 29 '22 23:09

Reza Aghaei