在 Windows 窗体应用程序中托管 ASP.NET Core API

2024-01-28

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

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


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

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

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

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

  2. Open Form1在设计模式下并删除TextBox on it.

  3. 改变Modifiers的财产textBox1在设计师中Public并保存它。

  4. Install Microsoft.AspNetCore.Mvc package

  5. Install Microsoft.AspNetCore package

  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. Create ValuesController.cs in the 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 in textBox1

进一步阅读

您也可能对。。。有兴趣如何在 Windows 窗体 (WinForms) 中使用依赖注入 (DI) https://stackoverflow.com/a/70476716/3110834

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Windows 窗体应用程序中托管 ASP.NET Core API 的相关文章

  • 为什么 fgets 接受 int 而不是 size_t?

    功能如strcpy malloc strlen 和其他各种接受他们的参数或返回值作为size t代替int or an unsigned int出于显而易见的原因 一些文件功能 例如fread and fwrite use size t以及
  • 带有嵌入 Flash 视频的 PDF 示例?

    有谁知道我在哪里可以查看嵌入 Flash 视频的 PDF 示例 我知道问这个问题很愚蠢 因为你会认为任何面向技术的用户都应该能够使用谷歌找到一个 但我真的找不到 我的另一个问题是 使用 C 中的 API 将 Flash 视频嵌入 PDF 文
  • 析构函数与成员函数竞赛

    当我在析构函数内时 其他线程是否可能开始执行对象的成员函数 遇到这种情况该如何处理呢 C 没有内在的保护来防止在删除对象后使用它 忘记竞争条件 另一个线程可以在完全删除你的对象后使用你的对象 Either 确保只有一个位置 代码拥有该对象
  • C 链表销毁函数

    我正在尝试学习 C 和很多人一样 我对指针有点困惑 无论如何 我创建了一个递归函数来销毁我的链表 但是正如我调试的那样 当我从函数返回时 列表的头部不应该为空 所以我猜这是对指针的一些基本误解 这是函数 void destroy struc
  • 更改实体的可访问性

    我想建立一个内部实体 我已将实体 其标量属性和导航属性更改为内部 当我尝试构建它时出现此错误 错误 6036 EntityType 文件 具有 内部 可访问性 EntitySet 文件 具有具有 公共 可访问性的 get 属性 Entity
  • 为什么 ObservableCollection 有两个集合构造函数?

    The 可观察集合 T https msdn microsoft com en us library ms668604类有两个构造函数 可以在其中传递项目集合 一个构造函数接受一个IEnumerable T 另一个List T 鉴于List
  • 使用 LINQ 展平嵌套字典

    所以我有一本形式的字典Dictionary
  • UI 线程正在阻塞调用 COM 对象的后台线程

    我正在开发一个通过第三方 COM 库与外部设备通信的应用程序 我试图让与设备的所有通信都通过后台线程 以防止通信问题搞砸我的应用程序 并消除在 UI 线程中进行通信所引入的一些其他复杂性 问题是 每当发生导致主 UI 线程阻塞的情况 即调用
  • 将视频上传/保存到数据库或文件系统

    我以前从未尝试过保存视频 所以我对此了解不多 我知道如果视频很小 我可以转换为字节数组并保存到数据库 但是为了提高效率 我想了解如何将任何上传的视频保存到我的服务器文件中 然后只保存该文件的文件路径我的数据库表中的视频 我完全不知道如何开始
  • 多选DataGridView没有CTRL键没有闪烁?

    我在表单 Form1 vb 上有一个 DataGridView 控件 需要允许用户在不使用 CTRL 键的情况下多选行 没有可用的键盘 他们使用触摸屏 我已启用 mutliselect 属性 并在 Form 类中包含以下代码 我的 Data
  • 我如何知道向量的实际最大大小? (不使用 std::vector::max_size)

    在在线课程中 我正在学习向量 在其中一个例子中 他们解释说 std vector max size 应该给我向量可以达到的最大大小 我决定测试一下 include
  • _MM_TRANSPOSE4_PS 在 GCC 中导致编译器错误?

    我第一次在 GCC 而不是 MSVC 中编译我的数学库 并经历了所有的小错误 我遇到了一个根本没有意义的错误 Line 284 error lvalue required as left operand of assignment 284号
  • 如何在 C 语言中获取输入中的空格

    我想从控制台获取字符数组 它还包含空格 我在 C 中知道的唯一方法是 scanf 但是一旦遇到空格 它就会停止接受输入 我该做什么 这就是我正在做的事情 char address 100 scanf s address 尝试使用 fgets
  • “DeploymentItem”属性是什么意思?

    假设我们有一个简短的程序 namespace ConsoleTryIt static class Program static void Main string args var sum Add 1 2 private static int
  • WCF 服务中的缓冲区大小

    我们有一个 WCF 服务 它执行某些存储过程并将结果返回给 silverlight 客户端 某些存储过程最多返回 80K 行 下面给出的是 web config 中服务的设置
  • 使用“const cv::Mat &”、“cv::Mat &”、“cv::Mat”或“const cv::Mat”作为函数参数的区别?

    我已经彻底搜索过 但没有找到一个简单的答案 传递 opencv 矩阵 cv Mat 作为函数的参数 我们传递一个智能指针 我们对函数内部的输入矩阵所做的任何更改也会改变函数范围之外的矩阵 我读到 通过将矩阵作为 const 引用传递 它不会
  • 从 RichTextBox 复制文本及其格式

    如何将 RichTextBox 中的文本及其格式复制到写字板或网络浏览器 就像复制纯文本一样 您可以使用Clipboard SetText method http msdn microsoft com en us library 6eahs
  • 从数据库配置中的连接字符串中删除 SSIS 密码

    我有一个 SSIS 包 它使用 SQL 服务器中的 SSIS 配置表来检索 OLE DB 连接管理器的连接字符串属性 问题是我还需要相同的连接字符串来调用使用实体框架的程序集 我尝试访问连接管理器连接字符串属性 但 SSIS 总是删除密码
  • Selenium - 模式对话框存在 - 如何接受信息?

    我有以下问题 在页面上提交一些日期后 我有一个如图所示的模式对话框 我想单击 ENTER 来浏览该模式 但它不起作用 我有以下代码 driver FindElement By CssSelector input submit Click A
  • SMTP 客户端在 C# 应用程序中显示错误“未采取请求的操作”

    我正在尝试使用 hotmail 帐户设置电子邮件发送应用程序 代码如下所示 MailMessage mail new MailMessage from to mail Subject Proba email mail Attachments

随机推荐

  • Linux 上应用程序数据(非用户特定)的存储位置

    In my OSGi https en wikipedia org wiki OSGi基于 Java 应用程序 我正在开发一个捆绑包 为系统的其余部分提供对文件系统的访问权限 除了提供对用户主目录的访问之外 我还希望提供对非用户特定区域的访
  • 让背景颜色延伸到溢出区域

    如果总计内容高度父级的大小是 10 000px 但overflow auto元素是rendered高度为 700px 我如何强制aside子元素动态渲染为 10 000pxinstead默认 700px 当您开始滚动时 您可以看到白色背景小
  • 从图表中获取文本格式的路径

    在我的图表中 我有如下数据 这里 a b c d 是节点 r1 r2 r3 r4 是关系 a r1 gt b b r2 gt a b r2 gt c c r1 gt b d r3 gt a a r1 gt d like this 我正在使用
  • Xcode 7.0 启动图像集“LaunchImage”有 2 个未分配的子项

    我刚刚将 xcode 更新到 7 0 并修复了大部分错误 但我不断收到此错误消息 启动图像集 LaunchImage 有 2 个未分配的子项 我已经删除了两个未分配的子项 但仍然收到此错误消息 尝试深层清洁Xcode 命令 alt shif
  • 有两个输入的表单未提交?

    有人可以解释一下为什么这段代码不起作用 form on submit function e e preventDefault var first first val var next next val alert first next ht
  • 数据库中的原子比较和交换

    我正在研究工作排队解决方案 我想查询数据库中的给定行 其中状态列具有特定值 修改该值并返回该行 并且我想以原子方式执行此操作 以便其他查询不会看到它 begin transaction select from table where pk
  • 如何将我的数据随机分成不同的小批量 [JULIA]

    我有一个包含 100000 个示例的数据向量 值为 1 和 1 我想从这个数据中得到16 个不同的小批量随机 每6250个 这是我的代码 用于生成 100000 个示例的向量 并将其存储在文件中 Dan 回答了如何将我的数据划分为不同部分的
  • Reporting Services 2005 部署错误:无法加载文件或程序集

    我制作了一份关于 Reporting Services 2005 的报告 该报告使用外部程序集 我将该程序集添加到项目中 报告 报告属性 参考 我还将程序集复制到文件夹中 C Program Files Microsoft SQL Serv
  • hive 在一定数量后自动递增

    我需要将数据插入目标表 其中除代理键列外 所有列都应从不同的源表填充 它应该是目标表的最大值加上从 1 开始的自动增量值 我可以使用 row number 函数生成自动增量值 但在同一个查询中 我应该如何从目标表获取代理键的最大值 HIVE
  • Windows Metro 应用程序中的 CollectionViewSource

    我有一个集合 我需要 3 个不同的视图1 收集所有数据2 分组数据 分组标准将在应用程序生命周期中修改 3 过滤数据 过滤条件将在应用生命周期中修改 我想要的是所有视图都应该绑定到同一个集合 以便对集合的任何更改都应该同步到所有视图 对于
  • 访问 Service Fabric 中的文件系统

    当我从服务总线队列收到新消息时 我需要在 Service Fabric 服务中使用 ffmpeg 对视频进行编码 我可以从资源中提取 ffmpeg exe 并运行它 但我可以将输入 输出视频文件保存在内部文件系统中吗 我通过以下代码在本地集
  • 用于监视下载文件夹添加内容的批处理文件

    我需要一个批处理文件来监视 下载 文件夹中的添加内容 但仅限于新添加的内容 像这样的事情 START NumOldFiles GetNumberOfFilesOld Delay 30 Seconds NumNewFiles GetNumbe
  • ec2 API 如何决定哪个可用区?

    我正在编写一项服务 该服务可以根据需要以编程方式启动 EC2 实例 我想给它最好的机会能够随时启动实例 最大限度地减少由于容量不足而导致的失败 实例在一个区域内的哪个可用区中运行并不重要 重要的是我有最好的机会启动实例 我想知道 如果我在使
  • 什么正则表达式模式将匹配包含某些字符的整个单词?

    我想匹配包含某些字母 字符的整个单词 例如 该模式将匹配包含该字母的所有单词l and a 例如car patrol left等等 但它不会匹配这样的词boom turnover digit etc 像这样的模式应该有效 b w al w
  • Java中多项式x^16 + x^12 + x^5 + 1计算CCITT标准CRC

    我需要帮助在 Java 中使用多项式 x 16 x 12 x 5 1 0x1081 计算 CCITT 标准 CRC 我在互联网上尝试了很多示例 但每个示例都返回与示例中不同的值 例如 对于此数组 0xFC 05 11 结果需要为 27 56
  • Android:有什么好的解决方案如何验证编辑框

    例如 我想要验证最小长度 如果是Email a PhoneNumber 这在安卓中怎么可能 我想验证一下 如果您想阻止用户输入某些内容 请扩展InputFilter并将其注册到您的EditText built in InputFilter
  • 如何使用 TWGL(WebGL 辅助库)绘制 2D 图像

    有很多关于如何使用 TWGL 绘制 3D 内容的示例https github com greggman twgl js tree master examples https github com greggman twgl js tree
  • 在c中对二维数组进行排序

    我正在尝试对二维数组进行排序 原始数组是 5 0 3 4 1 2 3 1 1 4 2 2 3 3 1 排序后 应该是这样的 3 1 1 3 3 1 4 2 2 4 1 2 5 0 3 这是我用来尝试实现冒泡排序的代码 i 代表行数 int
  • JMeter 3.2 中不存在 SOAP/XML-RPC Sampler

    我有点惊讶我的 JMeter 3 1 脚本在 3 2 中不起作用 JMeter 3 2 中删除 SOAP XML RPC Sampler 的原因是什么 是否存在一些性能问题等 这是 JMeter 的一部分change http jmeter
  • 在 Windows 窗体应用程序中托管 ASP.NET Core API

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