如何通过Delphi进程触发.NET SignalR服务端向客户端推送消息?
方案选择与实现指南
一、方案对比:Windows消息 vs 本地HTTP请求
- Windows消息方案不推荐:.NET应用部署在IIS中时,实际运行进程是
w3wp.exe(IIS应用池进程),多个.NET应用可能共用同一个进程,无法精准定位目标应用;且ASP.NET Core应用在IIS托管模式下,捕获自定义Windows消息需要额外的进程钩子或原生交互逻辑,实现复杂且维护成本高,完全没必要走这个路子。 - 本地HTTP请求是首选:HTTP是标准通信协议,Delphi端极易实现(用Indy、WinHTTP等组件即可),.NET端处理成熟,逻辑清晰,是最简便可靠的方案。
二、.NET SignalR应用的处理实现
1. 添加触发消息的API接口
在你的ASP.NET Core项目中新增一个API控制器,用来接收Delphi的请求,然后通过SignalR Hub向所有客户端推送消息:
[ApiController] [Route("api/notification")] public class NotificationController : ControllerBase { private readonly IHubContext<YourHubClass> _hubContext; // 构造函数注入SignalR Hub上下文 public NotificationController(IHubContext<YourHubClass> hubContext) { _hubContext = hubContext; } [HttpPost("broadcast")] public async Task<IActionResult> BroadcastMessage([FromBody] MessageModel model) { // 调用SignalR客户端方法(这里的"ReceiveBroadcast"要和前端客户端监听的方法名一致) await _hubContext.Clients.All.SendAsync("ReceiveBroadcast", model.Title, model.Content); return Ok(new { Success = true, Msg = "消息已推送至所有客户端" }); } } // 定义接收Delphi请求的消息模型 public class MessageModel { public string Title { get; set; } public string Content { get; set; } }
2. 配置CORS(本地请求需处理)
如果Delphi程序在本地运行,请求地址是http://localhost开头,需要在Program.cs中配置CORS允许本地请求:
builder.Services.AddCors(options => { options.AddPolicy("LocalAllowed", policy => { policy.WithOrigins("http://localhost") .AllowAnyHeader() .AllowAnyMethod(); }); }); // 注意:CORS中间件要放在路由和SignalR之前 app.UseCors("LocalAllowed"); app.UseRouting(); app.MapHub<YourHubClass>("/your-hub-path");
3. IIS配置检查
- 确保IIS的请求筛选中允许POST方法;
- 确认应用程序池的.NET版本与项目匹配,且权限足够访问站点目录;
- 如果有URL重写规则,要保证
api/notification/broadcast路径能正确路由到ASP.NET Core应用。
三、Delphi端发送HTTP请求示例
用Delphi的Indy组件实现POST请求(也可使用TWinHTTP等其他HTTP组件):
procedure TMainForm.btnSendNotificationClick(Sender: TObject); var IdHTTP: TIdHTTP; JsonStream: TStringStream; RespContent: string; begin IdHTTP := TIdHTTP.Create(nil); JsonStream := TStringStream.Create('{"Title":"Delphi触发通知","Content":"这是来自Delphi进程的SignalR推送消息"}', TEncoding.UTF8); try IdHTTP.Request.ContentType := 'application/json'; // 替换为你的.NET应用实际部署的API地址 RespContent := IdHTTP.Post('http://localhost/YourAppName/api/notification/broadcast', JsonStream); ShowMessage('请求成功:' + RespContent); except on E: Exception do ShowMessage('请求失败:' + E.Message); end; JsonStream.Free; IdHTTP.Free; end;
四、额外注意事项
- 身份验证:如果IIS启用了Windows身份验证或其他认证方式,Delphi端需要在请求中携带对应凭证(比如Indy可设置
IdHTTP.Request.NTLMAuthentication := True); - 安全性:生产环境要给API接口加验证(比如API密钥、JWT令牌),避免未授权调用;
- 错误处理:.NET端要添加异常捕获逻辑,返回标准化的错误响应;Delphi端要处理网络异常、HTTP错误码(如404、500)。
内容的提问来源于stack exchange,提问作者Magnus
相关产品推荐
相关产品推荐

