Хостинг ASP. NET Базовый API в приложении Windows Forms - PullRequest
3 голосов
/ 03 февраля 2020

Справочная информация: я работаю над проектом, который включает приложение WinForms. Клиент хочет предоставить локальный HTTP-сервер, чтобы другие приложения могли запускать функции на работающем экземпляре приложения WinForms через API REST (или аналогичный). Предпочтение состоит в том, чтобы реализовать вышеупомянутый API с использованием ASP. NET Core.

. Таким образом, мой вопрос таков: как мне структурировать проект, чтобы иметь как ASP. NET Core API, так и WinForms GUI в том же процессе? Есть ли какие-либо подводные камни, о которых мне следует опасаться?

1 Ответ

5 голосов
/ 03 февраля 2020

Хостинг ASP. NET CORE API в приложении Windows Forms и взаимодействие с формой

Вот базовый c пошаговый пример того, как создайте проект для размещения ASP. NET CORE API внутри Windows приложения Forms и выполните некоторое взаимодействие с формой.

Для этого выполните следующие действия:

  1. Создайте приложение Windows Forms, назовите его MyWinFormsApp
  2. Откройте Form1 в режиме конструктора и отпустите a TextBox на нем.
  3. Измените свойство Modifiers textBox1 в конструкторе на Public и сохраните его.
  4. Установите Microsoft.AspNetCore.Mvc пакет
  5. Установите Microsoft.AspNetCore пакет
  6. Создайте файл Startup.cs в root проекта и скопируйте следующий код:

    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 в root проекта.

  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 / значения / пока → Вы увидите bye в textBox1
...