首页 > 解决方案 > 在 Windows 窗体应用程序中托管 ASP.NET Core API

问题描述

背景:我正在从事一个涉及 WinForms 应用程序的项目。客户端希望公开一个仅限本地的 HTTP 服务器,以允许其他应用程序通过 REST API(或类似方法)在 WinForms 应用程序的运行实例上触发功能。首选是使用 ASP.NET Core 实现上述 API。

因此,我的问题是:如何构建一个项目以在同一进程中同时拥有 ASP.NET Core API 和 WinForms GUI?有什么我需要提防的陷阱吗?

标签: c#.netwinformsasp.net-coreasp.net-core-webapi

解决方案


在 Windows 窗体应用程序中托管 ASP.NET CORE API 并与窗体交互

这是一个关于如何创建项目以在 Windows 窗体应用程序中托管 ASP.NET CORE API 并与窗体执行一些交互的基本分步示例。

为此,请按照下列步骤操作:

  1. 创建一个 Windows 窗体应用程序命名它MyWinFormsApp

  2. Form1以设计模式打开并TextBox在其上放置一个。

  3. 将in 设计器的Modifiers属性更改为并保存。textBox1Public

  4. 安装Microsoft.AspNetCore.Mvc

  5. 安装Microsoft.AspNetCore

  6. Startup.cs在项目的根目录下创建一个文件,并复制以下代码:

     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. 将以下代码复制到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. Controllers在项目的根目录中创建一个名为的文件夹。

  9. ValuesController.cs在文件夹中创建Controllers并将以下代码复制到文件中:

     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. 运行应用程序。

  11. 输入“嗨”textBox1

  12. 打开浏览器并浏览 http://localhost:5000/api/values → 您将看到hi响应。

  13. http://localhost:5000/api/values/bye → 你会bye看到textBox1

延伸阅读

您可能还对如何在 Windows 窗体 (WinForms) 中使用依赖注入 (DI)感兴趣


推荐阅读