You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:54:25