c# - 在 Windows 窗体应用程序中托管 ASP.NET Core API
问题描述
背景:我正在从事一个涉及 WinForms 应用程序的项目。客户端希望公开一个仅限本地的 HTTP 服务器,以允许其他应用程序通过 REST API(或类似方法)在 WinForms 应用程序的运行实例上触发功能。首选是使用 ASP.NET Core 实现上述 API。
因此,我的问题是:如何构建一个项目以在同一进程中同时拥有 ASP.NET Core API 和 WinForms GUI?有什么我需要提防的陷阱吗?
解决方案
在 Windows 窗体应用程序中托管 ASP.NET CORE API 并与窗体交互
这是一个关于如何创建项目以在 Windows 窗体应用程序中托管 ASP.NET CORE API 并与窗体执行一些交互的基本分步示例。
为此,请按照下列步骤操作:
创建一个 Windows 窗体应用程序命名它
MyWinFormsApp
Form1
以设计模式打开并TextBox
在其上放置一个。将in 设计器的
Modifiers
属性更改为并保存。textBox1
Public
安装
Microsoft.AspNetCore.Mvc
包安装
Microsoft.AspNetCore
包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(); } } }
将以下代码复制到
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>(); } }
Controllers
在项目的根目录中创建一个名为的文件夹。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(); } } }
运行应用程序。
输入“嗨”
textBox1
打开浏览器并浏览 http://localhost:5000/api/values → 您将看到
hi
响应。http://localhost:5000/api/values/bye → 你会
bye
看到textBox1
延伸阅读
推荐阅读
- python - Python Dataframe 根据它们所属的组对行进行求和和排名
- applescript - 将值作为参数传递给处理程序
- java - docker image: openjdk:15: 如何在其中安装 python
- vue.js - 在 vue ant 设计步骤中包含一个独立的组件
- spring-batch - 春季批处理主从多个作业并行
- python - 将行和列附加到多维数组 Numpy Python
- node.js - 我将我的快递项目转移到了火力基地,护照会话停止在快递中工作
- python - M1 Macbook Python 在 Spyder 和 Atom IDE 上找不到模块
- java - 放大 fxml 时,scroolPane 上的 JavaFX scollBar 不起作用
- sql - SQLite GROUP BY 最低价格缺失结果