winforms 在Windows窗体应用程序中承载ASP.NET核心API

hjzp0vay  于 2022-11-17  发布在  Windows
关注(0)|答案(2)|浏览(253)

背景:我正在处理一个涉及WinForms应用程序的项目。客户端希望公开一个仅限本地的HTTP服务器,以允许其他应用程序通过REST API(或类似的API)触发WinForms应用程序的运行示例上的功能。首选项是使用ASP.NET核心实现上述API。
我的问题是这样的:我如何构建一个项目,使ASP.NET核心API和WinForms GUI在同一个进程中?有什么陷阱我必须警惕吗?

zour9fqk

zour9fqk1#

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

下面是一个基本的分步示例,介绍如何创建一个项目以在Windows窗体应用程序中承载ASP.NETCOREAPI,并执行与窗体的一些交互。
为此,请按照下列步骤操作:
1.创建一个Windows窗体应用程序,将其命名为MyWinFormsApp
1.在设计模式中打开Form1,并将TextBox放到它上面。
1.在设计器中将textBox1Modifiers属性更改为Public并保存。
1.安装Microsoft.AspNetCore.Mvc软件包
1.安装Microsoft.AspNetCore软件包
1.在项目的根目录中创建一个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();
         }
     }
 }

1.在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>();
     }
 }

1.在项目的根目录中创建一个名为Controllers的文件夹。
1.在Controllers文件夹中建立ValuesController.cs,并将下列程式码复制到档案:

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();
         }
     }
 }

1.执行应用程序。
1.在textBox1中键入“hi”
1.打开浏览器并浏览http://localhost:5000/api/values →您将看到hi作为响应。
1.您将在textBox1中看到bye

进一步阅读

您可能也对How to use Dependency Injection (DI) in Windows Forms (WinForms)感兴趣

dddzy1tm

dddzy1tm2#

我安装的Microsoft.AspNetCore.MvcMicrosoft.AspNetCore包不能使用
我查看了这个WebApplication.CreateBuilder Method Doc,发现需要Microsoft.AspNetCore.dll,但是我无法使用它。
我希望它能帮助其他人。
安装Microsoft.AspNetCore.App软件包

dotnet add package Microsoft.AspNetCore.App --version 2.2.8

最小API:

Microsoft.AspNetCore.Builder.WebApplication app = Microsoft.AspNetCore.Builder.WebApplication.Create(new string[] { });
app.MapGet("/", () => "Hello World!");
app.RunAsync();

好了,现在你可以打开http:localhost:5000来看Hello World!

  • 因为很少有人会在WinForm中使用参数,所以此处省略了string[] args,而使用new string[] { } *

如果你想使用控制器,比如ASP.NET核心,那么你可以使用这个:

var builder = Microsoft.AspNetCore.Builder.WebApplication.CreateBuilder(new string[]{});
builder.Services.AddControllers();

var app = builder.Build();
app.MapControllers();
app.RunAsync();

HomeController.cs

using Microsoft.AspNetCore.Mvc;

namespace RuyutWinFormsApi;

[Route("api/[controller]")]
[ApiController]
public class HomeController : ControllerBase
{
    [HttpGet]
    public IActionResult Get()
    {
        return Ok("This is a test api");
    }
}

您可以打开http://localhost:5000/api/home来查看This is a test api
BTY,如果要更改端口,可以添加以下内容:

app.Urls.Add("http://0.0.0.0:8080");

相关问题