19

是否可以在服务堆栈项目中使用 SignalR?我们目前正在为我们的 REST Web API 使用服务堆栈。我们对其架构、灵活性等总体上感到满意。现在我们正在探索使用事件驱动或推送技术(而不是轮询状态)与呼叫客户进行交流的方法。我应该注意,我们目前正在使用 AppHostHttpListenerBase 将我们的 API 托管在 Windows 服务中(与 IIS 内的托管相比)。

是否可以配置一条专用路由以某种方式传递给 SignalR Hub,以便这两者可以并存?例如http://localhost:8000/api/live/jobs/jobid会命中 SignalR 代码,但http://localhost:8000/api/jobs/jobid会路由到当前基于 DTO 的服务堆栈代码。

PS - 我们希望继续以自托管模式托管,因为我们喜欢移植到 Mono 并在 Linux 上运行的灵活性(而不是绑定到 IIS)。

4

2 回答 2

1

这篇博文描述了如何将 SignalR 与 ServiceStack 后端一起使用: SignalR、Filters 和 ServiceStack

总而言之,您必须将 ServiceStack Request 行为更改为 Bufferered,

public HelloAppHost()
    : base("Hello Web Services", typeof(HelloService).Assembly)
{
    PreRequestFilters.Add((req,res) => req.UseBufferedStream = true);
}

然后可以在服务方法中添加[IncomingHub]、[OutgoingHub]属性,如Get()、Post()等。

至于 ServiceStack 中的 OWIN 支持,请不要屏住呼吸。该线程显示了主要维护者的意见,即目前没有充分的理由添加支持。

于 2014-10-23T01:08:35.783 回答
0

SignalR 提供使用 OWIN 构建的自托管选项。

我注意到服务堆栈很快也会有一个 OWIN 托管的实现,以防您无法在适当的位置添加 SignalR。

然后,您可以使用Firefly之类的东西轻松托管应用程序的两个部分,而无需将自己绑定到任何一个服务器实现。

以下是自主机启动代码供参考:

using System;
using Microsoft.AspNet.SignalR;
using Microsoft.Owin.Hosting;
using Owin;

namespace SignalR.Hosting.Self.Samples
{
    class Program
    {
        static void Main(string[] args)
        {
            string url = "http://localhost:8080";

            using (WebApplication.Start<Startup>(url))
            {
                Console.WriteLine("Server running on {0}", url);
                Console.ReadLine();
            }
        }
    }

    class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapHubs();
        }
    }

    public class MyHub : Hub
    {
        public void Send(string message)
        {
            Clients.All.addMessage(message);
        }
    }
}
于 2013-01-27T22:54:53.863 回答