Использовать службу SignalR внутри службы Service Stack REST API
Можно ли использовать SignalR внутри проекта стека сервисов? В настоящее время мы используем стек сервисов для нашего веб-API REST. Мы были довольны своей архитектурой, гибкостью и т.д. Теперь мы изучаем способы общения с нашими вызывающими клиентами с использованием технологий, управляемых событиями или push (vs polling for status). Я должен отметить, что мы в настоящее время размещаем наш API в службе Windows, используя AppHostHttpListenerBase (против хостинга внутри IIS).
Можно ли сконфигурировать выделенный маршрут, который будет передан в концентратор SignalR так или иначе, чтобы эти два могли жить бок о бок? например http://localhost:8000/api/live/jobs/jobid
попадет в код SignalR, но http://localhost:8000/api/jobs/jobid
будет маршрутизировать текущий код стека службы на основе DTO.
PS - Мы хотели бы продолжить хостинг в режиме самостоятельного хоста, поскольку нам нравится гибкость переноса на Mono и работа на Linux (по сравнению с IIS).
Ответы
Ответ 1
В этом блоге описано, как использовать SignalR с бэкэндом ServiceStack:
SignalR, Фильтры и ServiceStack
Подводя итог, вы должны изменить поведение запроса ServiceStack на Bufferered,
public HelloAppHost()
: base("Hello Web Services", typeof(HelloService).Assembly)
{
PreRequestFilters.Add((req,res) => req.UseBufferedStream = true);
}
Затем вы можете добавить атрибуты [IncomingHub], [OutgoingHub] к методам службы, например Get() и Post() и т.д.
Что касается поддержки OWIN в ServiceStack, не задерживайте дыхание. Этот поток показывает мнение основного сопровождающего, что в настоящее время нет сильного аргумента для добавления поддержки.
Ответ 2
SignalR предоставляет собственный хост, построенный с использованием OWIN.
Я заметил, что Service Stack будет вскоре также будет иметь хостинговую реализацию 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);
}
}
}