Используйте конвейер SignalR 2.0 Owin с моей библиотекой SignalR

Я рассматриваю возможность обновления этой библиотеки до SignalR 2.0.

https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy

Я хочу, чтобы он поддерживал конвейер Owin 2.0 с интерфейсом IAppBuilder вместо использования RouteCollection, как это делал SignalR 1.x.

Проблема в том, как я могу получить набор маршрутов из IAppBuilder? Мне это нужно для регистрации пользовательского IHttpHandler, который обрабатывает мой собственный сценарий js (например, SignalR регистрирует свой сценарий концентратора)

1.x настройка моей библиотеки выглядит так

public static class SignalRConfig
{
    public static void Register(RouteCollection routes)
    {
        routes.MapHubs();
        routes.MapEventProxy<Contracts.Events.Event>();
    }
}

Моя цель для конфигурации 2.0 примерно такая

public static class SignalRConfig
{
    public static void Configuration(IAppBuilder app)
    {
        app.MapSignalR();
        app.MapEventProxy<Contracts.Events.Event>();
    }
}

Мой код, зависящий от RouteCollection, выглядит так

public static class RouteCollectionExtensions
{
    public static void MapEventProxy<TEvent>(this RouteCollection routes)
    {
        Bootstrapper.Init<TEvent>();

        routes.Add(new Route(
                       "eventAggregation/events",
                       new RouteValueDictionary(),
                       new RouteValueDictionary() {{"controller", string.Empty}},
                       new EventScriptRouteHandler<TEvent>()));
    }
}

Изменить: похоже, очень сложно заставить Owin обслуживать запрос. Могу ли я использовать вспомогательные методы в SignalR 2.0 для регистрации маршрута и обработчика этого маршрута?

обновление: похоже, я на правильном пути с этим кодом

using Owin;
using SignalR.EventAggregatorProxy.Boostrap;
namespace SignalR.EventAggregatorProxy.Owin
{
    public static class AppBuilderExtensions
    {
        public static void MapEventProxy<TEvent>(this IAppBuilder app)
        {
            Bootstrapper.Init<TEvent>();
            app.Map("/eventAggregation/events", subApp => subApp.Use<EventScriptMiddleware<TEvent>>());
        }
    }
}

Теперь мне просто нужно реализовать EventScriptMiddleware

обновление: Последняя часть головоломки, теперь мне просто нужно промежуточное программное обеспечение, чтобы на самом деле выплюнуть javacript, это должно быть легко

namespace SignalR.EventAggregatorProxy.Owin
{
    public class EventScriptMiddleware<TEvent> : OwinMiddleware
    {
        public EventScriptMiddleware(OwinMiddleware next) : base(next)
        {
        }

        public override Task Invoke(IOwinContext context)
        {
            return context.Response.WriteAsync("Hello world!!");
        }
    }
}

person Anders    schedule 29.10.2013    source источник


Ответы (1)


Окончательная версия выглядит так, расширение для конструктора приложений

public static class AppBuilderExtensions
{
    public static void MapEventProxy<TEvent>(this IAppBuilder app)
    {
        Bootstrapper.Init<TEvent>();
        app.Map("/eventAggregation/events", subApp => subApp.Use<EventScriptMiddleware<TEvent>>());
    }
}

Вызвать метод в промежуточном программном обеспечении

public override Task Invoke(IOwinContext context)
{
    var response = context.Response;
    response.ContentType = "application/javascript";
    response.StatusCode = 200;

    if (ClientCached(context.Request, scriptBuildDate))
    {
        response.StatusCode = 304;
        response.Headers["Content-Length"] = "0";
        response.Body.Close();
        response.Body = Stream.Null;

        return Task.FromResult<Object>(null);
    }

    response.Headers["Last-Modified"] = scriptBuildDate.ToUniversalTime().ToString("r");
    return response.WriteAsync(js);
}

Полный исходный код здесь

https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/tree/master/SignalR.EventAggregatorProxy/Owin

person Anders    schedule 31.10.2013