簡體   English   中英

如何編寫 Web API、自托管、Windows 服務

[英]How to write Web API, Self hosting, Windows Service

我無法理解這一點。 我不斷收到例外

拋出異常:mscorlib.dll 中的“System.AggregateException”,並顯示一條消息:“表達式計算器中的內部錯誤。” 並且沒有內部異常!

除了服務器啟動時,我找不到錯誤來自哪里,這一行:_server.OpenAsync().Wait();

我認為使用 DI 是個好主意,雖然我的問題來自 Autofac,但正如您所看到的,我已經將其全部注釋掉了,但我仍然遇到此異常。 相關代碼在最后一個方法中。 請看一下代碼:

using System;
using System.ServiceProcess;
using System.Threading;
using System.Reflection;
using ServicesUtilities;
using System.Web.Http;
using System.Web.Http.SelfHost;
using Autofac;
using Autofac.Integration.WebApi;

namespace SeviceMerge
{

    partial class MergeService : ServiceBase, IQuasiServiceBase
    {
        private HttpSelfHostServer _server;
        private bool _runOnStart;
        public InjectionService()
        {
            InitializeComponent();
            _runOnStart = Config.Run;
        }

        protected override void OnStart(string[] args)
        {
            WebApiListener();
        }

        protected override void OnStop()
        {
            _runOnStart = false;

            _server.CloseAsync().Wait();
            _server.Dispose();
        }
        void IQuasiServiceBase.OnStart(string[] args, bool isBatchMode)
        {
            OnStart(args);
        }

        void IQuasiServiceBase.OnStop()
        {
            OnStop();
        }

        bool IQuasiServiceBase.PauseCheck()
        {
            return false;
        }

        bool IQuasiServiceBase.StopCheck()
        {
            return false;
        }

        private void WebApiListener()
        {
            var config = new HttpSelfHostConfiguration("http://localhost:26675");

            config.Routes.MapHttpRoute(
                "Presents",
                "api/{controler}/{id}",
                new { id = RouteParameter.Optional }
            );

            _server = new HttpSelfHostServer(config);
            _server.OpenAsync().Wait();
        }
    }
}

這是我的控制器代碼:

using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace AEMtoParmedInject.Controllers
{
    public class AemToParmedMergeController : ApiController
    {
        private ILogger _logger;
        private IWorkTheMachine _worker;
        public AemToParmedMergeController()
        {
            _logger = new Logger();
            //_worker = worker;
        }

        [HttpGet]
        public HttpResponseMessage Index()
        {
            return new HttpResponseMessage()
            {
                Content = new StringContent(
                    "<html>" +
                        "<head>" +
                        "</head>" +
                        "<body>" +
                            "<p>By click on the button below you are signaling the AEM to Parmed Merge service to perform it task</p>" +
                            "<form>" +
                                "<input type='submit' action='Index' value='Integrate AEM Content'>" +
                            "</form" +
                        "</body>" +
                    "</html>",
                    Encoding.UTF8,
                    "text/html"
                )
            };
        }
    }
}

.net core 中的一切都從一個簡單的控制台應用程序開始,在這里我給你 5 個簡單的步驟,你可以使用這些步驟在工作服務中自托管一個 Web API/Web APP,並在你的 Windows 服務中托管最終的 .exe,甚至你可以在 Linux Systemd 中托管,只需稍作改動。

我創建了一個非常簡單的 Worker-Service Web-API 模板,它存在於我的 GitHub 個人資料中。 以下步驟 100% 有效,但如果您遇到任何問題,您可以在這里提問,或者您可以從我的 GitHub 克隆模板並使用它並閱讀那里的文檔。

執行以下步驟:

  1. 創建 .net 核心控制台應用程序。
  2. 使用 NuGet 安裝包“Microsoft.AspNetCore.App”和“Microsoft.Extensions.Hosting.WindowsServices”。
  3. 創建一個 Worker.cs 文件來處理您的工作器服務。 將以下代碼放入:
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

namespace WorkerServiceWebAppTemplate
{
    public class Worker : BackgroundService
    {
        private readonly ILogger<Worker> _logger;

        public Worker(ILogger<Worker> logger)
        {
            _logger = logger;
        }

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
                await Task.Delay(1000, stoppingToken);
            }
        }
    }
}
  1. 創建一個 Startup.cs 文件,該文件將處理您的 Web 主機並在根地址中創建一個簡單的 GET API,並負責顯示一條簡單的消息。 你可以擴展它。 將以下代碼行放入 Startup.cs 文件中:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Hosting;

namespace WorkerServiceWebAppTemplate
{
    public class Startup
    {
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
                app.UseDeveloperExceptionPage();
            else
                app.UseHsts();

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("Hello World!");
                });
            });
        }
    }
}
  1. 最后要啟動工作服務並在工作服務中托管您的 Web API,並且為了讓您發布的 .exe 文件能夠在 Windows 服務中托管,請在您的 Program.cs 中使用以下代碼:
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace WorkerServiceWebAppTemplate
{
    class Program
    {
        static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        private static IHostBuilder CreateHostBuilder(string[] args)
        {
            return Host.CreateDefaultBuilder(args)
                .UseWindowsService()
                .ConfigureServices((hostBuilderContext, services) =>
                {
                    services.AddHostedService<Worker>();
                })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM