在 Azure IoT Edge 上将现有 ASP.NET 核心 Web 应用程序转换为边缘模块 运行

Turn existing ASP.NET Core Web App to Edge module running on Azure IoT Edge

我有一个现有的 ASP.NET 核心 Web 应用程序 运行ning 作为 docker 容器,我想将其作为边缘模块 运行ning 在 Azure IoT 上提供边缘。 从文档中我知道我可以 运行 Azure Functions、Stream Analytics 和自定义模块(根据我的理解,它们只是与 Azure IoT Edge Runtime 集成的控制台应用程序)。

将我的 ASP.NET 核心 Web 应用程序转变为边缘模块并与 Edge Hub 交互的最佳方法是什么?

最好的方法是使用自定义模块作为模板,将我的 ASP.NET 核心项目移动到适合文件结构并将 docker 文件编辑为 运行 我的主要 ASP.NET 核心组件?

感谢您的指教!

更新: 我正在遵循上述方法。我创建了一个自定义边缘模块,并尝试使用以下 steps:

将其转换为最简单的 ASP.NET Core Web App
  1. 添加包参考 <PackageReference Include="Microsoft.AspNetCore.App" Version="2.1.1" />
  2. 添加启动项class

    public class 启动 {

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            app.Run(async r => await r.Response.Body.WriteAsync(Encoding.UTF8.GetBytes("seas")));
    
            loggerFactory.AddConsole();
        }
    }
    
  3. 将此方法添加到 Program.cs:

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(参数) .UseStartup();

  4. 将Main的内容替换为CreateWebHostBuilder(args).Build().Run();

我可以将容器作为 Azure IoT Edge 的一部分启动,但容器会不断 ps 重新启动,所以我想,我的方法并不正确。不幸的是,我也无法访问容器的控制台,因为它每隔几秒就会重新启动...

sudo 的输出 docker ps ...

4b23cdad5bc5        localhost:5000/simpleweb:0.0.1-amd64                              
"dotnet SimpleWeb.dll"    5 minutes ago       Restarting (150) 58 seconds ago

...

PS:我正在使用 iot edge dev 容器按照此快速入门进行测试: https://github.com/Azure/iotedgedev/wiki/quickstart-with-iot-edge-dev-container

如果您的应用程序已经容器化,那么您应该不需要添加太多内容来使其成为 Edge 模块:

  • 添加 nuget 包 Microsoft.Azure.Devices.Client
  • 在您的代码中某处初始化 ModuleClient,可能在某些启动例程中:ModuleClient moduleClient = await ModuleClient.CreateFromEnvironmentAsync(transportType);

  • 使用 moduleClient 与您的 asp.net 内容一起发送和接收消息

  • 将此容器作为模块添加到您的 deployment.json(并使其在容器存储库中可用)

这应该非常简单。您不需要从模块模板或 Dockerfiles 开始。如果你看看它们,真的没有魔法。