是否可以在服务堆栈项目中使用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绑定)。
答案 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);
}
}
}