在Service Stack REST API服务中使用SignalR

时间:2012-12-01 04:02:50

标签: web webserver signalr servicestack

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

是否可以配置一条专门的路线,以某种方式传递给SignalR Hub,这两个可以并排生活?例如http://localhost:8000/api/live/jobs/jobid将触及SignalR代码,但http://localhost:8000/api/jobs/jobid将路由到当前基于DTO的服务堆栈代码。

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

2 个答案:

答案 0 :(得分:1)

此博客文章介绍如何将SignalR与ServiceStack后端一起使用: SignalR, Filters and ServiceStack

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

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

然后你可以将[IncomingHub],[OutgoingHub]属性添加到服务方法中,比如Get()和Post()等。

对于ServiceStack中的OWIN支持,请不要屏住呼吸。 This thread显示主要维护者的意见,即目前没有强有力的补充支持。

答案 1 :(得分:0)

SignalR提供了使用OWIN构建的self host选项。

我注意到Service Stack将soon also have an OWIN hosted implementation,以防您无法添加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);
        }
    }
}