gpt4 book ai didi

c# - 将 SignalR 2.0 Owin 管道与我的 SignalR 库结合使用

转载 作者:行者123 更新时间:2023-12-02 03:34:19 25 4
gpt4 key购买 nike

我正在考虑将此库升级到 SignalR 2.0

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

我希望它通过 IAppBuilder 接口(interface)支持 2.0 Owin 管道,而不是像 SignalR 1.x 那样使用 RouteCollection

问题是,如何从 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

更新:最后一 block 拼图,现在我只需要我的中间件来实际吐出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!!");
}
}
}

最佳答案

最终版本如下所示,应用程序构建器扩展

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

关于c# - 将 SignalR 2.0 Owin 管道与我的 SignalR 库结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19653551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com