分布式系统上的Asp.net Azure SignalR服务

时间:2019-06-19 23:05:48

标签: c# asp.net azure signalr signalr-backplane

我有一个运行在Asp.net 4.7.2上的Web应用程序。该应用程序包含一些REST端点,这些端点将被查询,然后将工作委托给位于另一台计算机上的Windows服务。

此服务的工作完成时,我想使用SignalR向客户端发送消息以指示工作已完成。因为此服务在另一台计算机上,所以这非常棘手。

我尝试使用Azure SignalR服务作为高于此的抽象级别。我的意图是使用REST功能来调用此Azure服务,让它从集线器(我目前在Web应用程序中已定义和创建)中运行代码,然后向客户端广播消息。

目前,我不确定这是否可行。注释指出,REST规定仅在库的asp.net CORE版本中可用。我已经致电端点并收到了接受的响应,但是没有运气。

那么,我的问题是,如何在我的条件下运行以下体系结构?如果不能,您还有其他建议吗?

机器1:

  • 运行定制代码的Windows服务花费了不可预测的时间

  • 代码完成后,通过azure服务将消息发送到SignalR集线器

机器2:

  • 包含SignalR集线器定义和客户端逻辑的Webapp。

1 个答案:

答案 0 :(得分:0)

实际上,您可以仅使用现有的Webapp来完成此服务。关键是创建一个与Windows Hub链接的Windows服务要调用的端点。

因此,如果我在.Net 4.x中创建一个简单的SingalR集线器:

public class NotificationHub : Hub
{
    public void Send(string message)
    {
        Clients.All.addNewMessageToPage(name, message);
    }
}

我可以在WebApi控制器中访问它:

public class NotificationController : ApiController
{
    IHubContext context;

    public NotificationController()
    {
        context = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();
    }

    public HttpResponseMessage Get(string message)
    {
        object[] args = { message };
        context.Clients.All.Send("Send", args) ;

        return Request.CreateResponse(HttpStatusCode.OK);
    }
}

在MVC和WebApi之类的框架中,使用REST端点将是最简单的,但是,如果您需要做的不仅仅是向客户端返回消息,还可以在诸如Service Bus之类的之间添加消息传递服务。