Подтвердить что ты не робот

Использовать службу 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).

4b9b3361

Ответ 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);
        }
    }
}