# HVE_web **Repository Path**: luckyyichen/hve_web ## Basic Information - **Project Name**: HVE_web - **Description**: 山东海慧环境的云平台代码,用于HJ212解析 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-05-28 - **Last Updated**: 2026-06-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # HJ212报文监控平台 - 项目创建与部署指南(学习记录) 本文档记录使用 Blazor Server + ASP.NET Core + SQLite 开发 HJ212 报文监控平台的全过程,包括项目创建、配置、部署及常见问题解决方法。适用于后续类似项目的快速搭建。 ## 一、新建项目时的选项含义(Visual Studio 2022) ### 1. 项目模板选择 Blazor Server 应用:使用 C# 编写前端逻辑,通过 SignalR 实时通信,适合内部管理系统、监控看板等。 ### 2. 关键配置选项 | 选项 | 含义 | 推荐选择 | |------|------|----------| | 框架 | .NET 版本(如 .NET 8.0、.NET 9.0) | 最新稳定版本(如 .NET 8.0) | | 身份验证类型 | 是否内置登录、注册等 | 个人项目选“无”;企业应用可选“个人账户”或“Microsoft Entra ID” | | 配置 HTTPS | 自动生成开发证书,启用 `https://localhost` | ✅ 勾选(开发时安全,部署时可换用 http) | | 不使用顶级语句 | 控制 `Program.cs` 的写法风格 | ❌ 不勾选(使用顶级语句,代码更简洁) | | 在应用程序 URL 中使用 `.dev.localhost` TLD | 将 `localhost` 改为 `项目名.dev.localhost`,用于解决某些 Cookie/SSO 问题 | ❌ 不勾选(一般用 localhost 即可) | | 交互式渲染模式 | 选择 `Server`(服务器端渲染)或 `WebAssembly` | `Server`(简化部署,适合内部监控) | > 创建项目后,会自动生成 `Pages/Index.razor` 首页、`Program.cs`、`appsettings.json` 等文件。 ## 二、开发过程中的必要配置 ### 1. 安装 NuGet 包(通过“管理 NuGet 程序包”) | 包名 | 用途 | |------|------| | Microsoft.EntityFrameworkCore.Sqlite | SQLite 数据库支持 | | Microsoft.EntityFrameworkCore.Tools | 迁移命令工具(Add-Migration, Update-Database) | | Microsoft.EntityFrameworkCore.Design | 设计时支持(迁移时必需) | | HJ212Interpreter(或其他 HJ212 解析库) | 解析 HJ212 协议报文 | ### 2. 添加实体模型(Models 文件夹) 创建以下类: * Device.cs:设备信息(MN、名称、创建时间等) * MonitorData.cs:监测数据(设备号、时间、因子代码、值) * HJ212Packet.cs:原始报文记录(QN、ST、CN、MN、CP、原始字符串等) ### 3. 添加数据库上下文(Data 文件夹) ``` ApplicationDbContext.cs 继承 DbContext,包含 DbSet。 ``` ### 4. 配置连接字符串(appsettings.json) ``` "ConnectionStrings": { "DefaultConnection": "Data Source=hj212.db" } ``` ### 5. 注册 DbContext(Program.cs) ``` csharp builder.Services.AddDbContextFactory(options => options.UseSqlite(builder.Configuration.GetConnectionString("DefaultConnection"))); ``` 注意使用 AddDbContextFactory 而不是 AddDbContext,以便在 Blazor 组件中手动创建上下文(避免生命周期问题)。 ### 6. 使用迁移创建数据库 打开“程序包管理器控制台”(工具 → NuGet 包管理器 → 程序包管理器控制台) 执行命令: ``` text Add-Migration InitialCreate Update-Database ``` 此时项目目录下会生成 Migrations 文件夹和 hj212.db 数据库文件。 ### 7. 实现后台 TCP 服务(接收 HJ212 报文) 创建 TcpServer.cs 继承 BackgroundService 或使用简单的 TcpListener + ThreadPool。需要注入 IServiceScopeFactory 以操作数据库。 ### 8. 创建 Blazor 页面(如 Monitor.razor) 设置路由 @page "/" 注入 IDbContextFactory 查询数据 使用 System.Timers.Timer 实现定时刷新 ### 9. 注册后台服务(Program.cs) ```csharp builder.Services.AddSingleton(); // 在 var app = builder.Build(); 之后获取实例并启动 var tcpServer = app.Services.GetRequiredService(); tcpServer.Start(2121); ``` ## 三、部署到 IIS(Windows Server) ### 1. 服务器环境准备 安装 .NET Windows Server 托管捆绑包(包含运行时和 AspNetCoreModuleV2) 下载地址:https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-aspnetcore-8.0.0-windows-hosting-bundle-installer 安装后必须重启 IIS(以管理员身份运行 iisreset) ### 2. 发布应用 在 Visual Studio 中右键项目 → 发布 → 选择“文件夹” 目标运行时:win-x64(或 便携式) 发布到本地文件夹(如 publish) ### 3. 复制文件到服务器 在服务器上创建目录(如 C:\HJ212Monitor) 将 publish 文件夹内的所有文件(不是文件夹本身)复制到该目录 ### 4. IIS 中添加网站 打开 IIS 管理器 右键“网站” → 添加网站 网站名称:HJ212Monitor 物理路径:C:\HJ212Monitor 绑定:http,IP 地址“全部未分配”,端口 8012(或 80) 应用程序池:可新建专用池(如 HJ212MonitorAppPool) ### 5. 应用程序池设置 选中新建的应用程序池 → 高级设置 .NET CLR 版本:无托管代码 托管管道模式:集成 加载用户配置文件:True ### 6. 文件夹权限设置 右键 C:\HJ212Monitor → 属性 → 安全 → 编辑 → 添加 输入 IIS_IUSRS → 确定 → 赋予“读取和执行”、“列出文件夹内容”、“读取” 如果需要 SQLite 写入数据库,还需添加“修改”权限 同时添加应用程序池标识:IIS AppPool\HJ212MonitorAppPool(若使用专用池)并赋予相同权限 ### 7. 检查 web.config 文件 确保发布目录中存在 web.config,且包含以下核心配置: xml ### 8. 启动网站并测试 在 IIS 中启动网站 服务器本地访问 http://localhost:8012 外网访问 http://服务器公网IP:8012(需放行防火墙和安全组端口) ## 四、常见问题及解决方法 ### 1. HTTP 错误 401.3 - Unauthorized 现象:访问网站提示“您无权查看此目录或页面”。 原因:IIS 进程账户没有读取物理路径的权限。 解决: 给文件夹添加 IIS_IUSRS(或 IIS AppPool\应用程序池名)的读取和执行权限。 确保没有将网站目录放在 C:\Users\ 等受保护路径下。 ### 2. HTTP 错误 403.14 - Forbidden(目录浏览未启用) 现象:浏览器显示“Web 服务器被配置为不列出此目录的内容”。 原因:IIS 未能识别 .NET Core 应用,尝试以静态文件方式处理请求。通常是因为缺少 AspNetCoreModule 或 web.config 缺失。 解决: 安装 .NET Windows Server 托管捆绑包。 重启 IIS(iisreset)。 确认发布目录中存在 web.config。 确认应用程序池的 .NET CLR 版本为“无托管代码”。 ### 3. 访问网站显示“Error.”(生产环境错误页) 现象:没有具体异常信息。 原因:ASP.NET Core 默认只在开发环境显示详细错误。 临时查看详细错误: 修改 web.config,添加环境变量: xml 或者手动运行 dotnet 02HJ212Server.dll --urls "http://*:8012" 查看控制台输出。 ### 4. 数据库错误:no such table: Packets 现象:页面报错或日志显示 SQLite Error 1: 'no such table: Packets'。 原因:数据库文件不存在或未执行迁移。 解决: 方法一:从开发电脑复制完整的 hj212.db 文件到服务器发布目录。 方法二:在服务器上安装 .NET SDK,运行 dotnet ef database update。 方法三:修改代码,在 Program.cs 中添加 db.Database.EnsureCreated() 或 db.Database.Migrate(),然后重新发布。 ### 5. 端口无法访问(外网) 现象:服务器本地能访问,外网无法打开。 检查顺序: 服务器防火墙是否放行了该端口(入站规则)。 京东云(或云服务商)安全组是否放行了该端口(入站方向)。 网站绑定的 IP 是否为“全部未分配”(而不是 127.0.0.1)。 如果使用 dotnet 命令行,启动时需指定 --urls "http://*:8012"(监听所有网络接口)。 ### 6. SQLite 数据库只读或无法写入 现象:程序能读取但无法保存新数据,或提示 attempt to write a readonly database。 解决:给发布文件夹及 hj212.db 文件授予 IIS_IUSRS(或 IIS AppPool\池名)的修改/完全控制权限。 ### 7. IIS 应用程序池崩溃或无响应 现象:网站无法启动,或者启动后很快停止。 检查: 应用程序池的“进程模型” → “空闲超时”是否设为 0(禁止空闲回收)。 “回收” → “固定时间间隔”是否设为 0。 事件查看器(Windows 日志 → 应用程序)中查找 dotnet 相关错误。 ### 8.修改默认监听端口 你的监听端口是代码中硬编码的(TcpServer.Start(2121)),不重新编译无法直接修改。但如果愿意做一次最小的代码调整(然后重新发布一次),以后就可以通过配置文件随意改端口,无需再编译。 如果你想“不重新发布”就改端口(目前做不到),因为已编译的 dll 中端口号是固定的,无法在服务器上直接修改。 #### 推荐方案:修改代码支持配置文件(改一次,以后随便改) ##### 1. 修改 appsettings.json,添加端口配置 ``` json { "Logging": { ... }, "AllowedHosts": "*", "ConnectionStrings": { ... }, "TcpServer": { "Port": 8011 } } ``` ##### 2. 修改 Program.cs,读取配置 找到 var tcpServer = app.Services.GetRequiredService(); 这一行,改为: ```csharp var tcpPort = builder.Configuration.GetValue("TcpServer:Port", 2121); var tcpServer = app.Services.GetRequiredService(); tcpServer.Start(tcpPort); ``` ##### 3. 重新发布(只需这一次) 在本地重新发布项目。 将 publish 文件夹中的 02HJ212Server.dll 和 appsettings.json 覆盖到服务器。 重启 IIS 网站或手动运行 dotnet。 ##### 4. 以后改端口 直接修改服务器上的 appsettings.json 中的 "Port": 8011,然后重启网站(或命令行程序)即可,无需再编译发布。 ## 五、常用命令速查 ### 1. 手动运行应用(绕过 IIS) cmd cd C:\HJ212Monitor dotnet 02HJ212Server.dll --urls "http://*:8012" ### 2. 重启 IIS cmd iisreset ### 3. 停止 / 启动特定网站(IIS 管理器) cmd # 以管理员身份打开 PowerShell Stop-WebSite -Name "HJ212Monitor" Start-WebSite -Name "HJ212Monitor" ### 4. 设置环境变量(临时) cmd set ASPNETCORE_ENVIRONMENT=Development dotnet 02HJ212Server.dll ### 5. 检查端口占用 cmd netstat -ano | findstr :8012 ### 6. 查看 IIS 日志 默认路径:C:\inetpub\logs\LogFiles\W3SVC\ ## 六、总结 * 项目类型:Blazor Server(适合内部监控,C# 全栈) * 数据库:SQLite + EF Core(无需安装数据库服务器) * 部署:IIS + .NET 托管捆绑包(稳定、支持开机自启) * 常见陷阱:权限不足、缺少托管模块、数据库表未创建、端口未放行。 * 完成以上步骤后,即可获得一个运行在云服务器上的 HJ212 报文监控平台,支持 TCP 接收、报文解析、数据存储和 Web 实时展示。 ## 七、VS2026快捷键 | 功能 | 快捷键 | |------|------| | 发布 | ALT+B+H | | Microsoft.EntityFrameworkCore.Tools | 迁移命令工具(Add-Migration, Update-Database) | | Microsoft.EntityFrameworkCore.Design | 设计时支持(迁移时必需) | | HJ212Interpreter(或其他 HJ212 解析库) | 解析 HJ212 协议报文 | ## 八、拓展操作 虽然 Visual Studio 没有直接能“一键推送到京东云”的内置按钮,但确实有几种方法可以帮你实现快速部署。具体选哪个,主要看你更习惯哪种方式。 * ⚡️ 方案一:在 VS 中用插件「一键推送」(AntDeploy) 这个方法最贴近你想要的效果,可以直接在 VS 里完成发布和推送。 场景:追求最高效,希望所有操作都在 VS 里完成。 设置:在 VS 扩展 > 管理扩展 中联网搜索并安装 AntDeploy,装好后重启 VS。首次使用时,需要在 工具 > AntDeploy 配置你的服务器地址、端口和验证信息(Token)。 使用:配置好后,在项目中右键 -> AntDeploy -> 发布到 xxx 即可。 * 🚀 方案二:用命令行发布,直接推送 如果你更喜欢敲命令,也能实现自动化。 场景:习惯使用命令行,并希望建立完全的自动化流程。 核心命令: ``` bash # 先发布项目 dotnet publish -c Release -o ./publish ``` 上传与重启:发布后,编写一个批处理脚本(.bat),用 scp 将文件传过去,再用 ssh 执行远程命令来重启服务。 * ⚙️ 方案三:在京东云上搭建自动化流水线 如果你的项目会长期迭代,配置一次,后续就能完全自动化。 场景:项目需长期维护,适合团队协作。 京东云 DevOps:在京东云控制台找到“DevOps”服务,新建流水线,将其连接到你的代码仓库。流水线会自动完成从编译、打包到部署的所有任务。 * 🔧 方案四:用命令行工具 (CLI) 上传并手动重启 这个方法最简单直接,需要你手动输入命令。 场景:只是临时上传,不打算配置自动化。 步骤:先在项目目录执行 dotnet publish -c Release -o ./publish 进行发布。然后用 jdc oss upload 这样的京东云 CLI 工具,把 publish 文件夹里的内容上传到服务器。上传完毕后,再用 ssh 登录到服务器,手动执行命令重启你的应用。 ⚠️ 关键提醒:无论用哪种方法,都建议把 appsettings.json 放在 IgnoreList (像 AntDeploy) 或从脚本的复制列表里排除。这能保证线上和本地的配置文件是分开的,避免出现意外情况。