在Orchard CMS中的SignalR聊天模块

4

我正在为我正在开发的“果园项目”构建一个即时聊天模块。我希望使用SignalR来驱动聊天功能,但是我在这方面遇到了一些困难:

<script src="@Url.Content("~/signalr/hubs")" type="text/javascript"></script>

无论我尝试什么,都会收到404错误。我在webconfig中有RAMFAR,我已经尝试在IIS上重新编写URL。我希望这是一些非常简单的东西,我的混乱大脑无法看清楚。我甚至不确定SignalR是否与Orchard兼容,虽然我怀疑会有一些困难。

2个回答

6
这比@mdm描述的要复杂得多...SignalR使用一个自定义的HttpModule来处理hubs。不幸的是,由于模块程序集的动态加载,没有办法从模块中连接该HttpModule而不修改Orchard core。
幸运的是,我设法解决了问题,并制作了一个与Orchard和SignalR一起良好运行的实时演示!让它工作起来相当棘手,需要放弃HttpModule,采用自定义路由实现。在做必要的清理工作后,我将把模块推送到Orchard Gallery并在此处发布更新。
更新:模块快要完成了。自从我开始以来,SignalR库发生了很多变化,所以需要加以整合。另外,还有一个Orchard核心的轻微更改(会话处理),我需要在实际发布模块之前推送。

更新2: SignalR现在使用Owin,因此将所有内容连接起来变得更加容易。Orchard模块可以在这里找到。您还可以从BitBucket获取最新代码。顺便说一句,由于数据库事务处理的更改,我强烈建议使用Orchard 1.x分支的代码进行SignalR开发。


@PiotrSzmyd,您能否解释一下您的模块具体是做什么的?我看了源代码,但感到相当困惑。 - ViRuSTriNiTy
1
@ViRuSTriNiTy 这个模块基本上可以让基于SignalR的代码在Orchard中运行,而无需任何自定义配置 - 它会进行适当的路由注册并支持多租户,还可以在连接/中心中添加DI支持等。换句话说 - 所有底层的重活都已经完成了。 - Piotr Szmyd
@PiotrSzmyd 谢谢,我已经成功地将你的模块与Orchard 1.8.1一起运行。虽然我花了很大的力气,但是它终于可以工作了,太好了。现在,我只需要创建一个派生自 Microsoft.AspNet.SignalR.Hub 的中心类,剩下的就会神奇地被发现/生成了吗?SignalR教程包括创建一个启动类等步骤... - ViRuSTriNiTy
1
@ViRuSTriNiTy 没错,这是你唯一需要做的事情。Hub/Connection类将会自动被发现并注册。该模块处理了SignalR运行所需的所有引导程序。 - Piotr Szmyd
@PiotrSzmyd 真是一个牛逼的模块,但还有一些问题。a)是否有办法将 signalr/hubs 映射到 ~/Modules/MyModule/signalr/hubs 而不是 ~/signalr/hubs?b)是否有办法从服务器(操作方法)向客户端广播消息(因为 %HubContext%.Clients.All.%javascriptMethod%() 不起作用)? - ViRuSTriNiTy
显示剩余5条评论

0

页面输出的URL是什么?您希望它显示哪个URL?

通常,您应该将SignalR代码放在Scripts/signalr中,并在视图顶部使用以下内容引用脚本:

@{
    Script.Include("signalr/script.js");
}

或者你可以在你的模块中实现一个IResourceManifestProvider(Orchard.jQuery有一个绝佳的例子,或在这里查看),然后使用Script.Require引用你的脚本:

@{
    Script.Require("SignalR_Hubs");
}

这是一个动态创建的脚本,我认为它是在应用程序启动时生成的。从我所了解的情况来看,问题在于生成此中心脚本的过程未在orchard启动时运行,因此永远不会生成。可能需要创建一个新模块,在应用程序启动前运行以防止Orchard动态加载它(我认为这是正在发生的),或者根本不加载它。我尝试将signalr的dll添加到orchard.webs bin文件夹中,但它没有起作用。我会继续挖掘,感谢您的时间 :) - Hazza
没问题 :) 我偶然发现了这个链接:https://dev59.com/Qmsz5IYBdhLWcg3wNVAR,可能是 web.config 设置不匹配(也许你正在使用 IIS7 并查看 IIS6 的文档或反之亦然)。至于 SignalR 是否适用于 Orchard,我不知道为什么不适用 - 它都是 ASP MVC,Orchard 很高兴让你创建控制器并将其用作更大应用程序的框架。 - mdm
是的,我已经在整个网络上搜寻了大量关于这方面的信息,你会认为它们应该完美地配合使用,但除非我错过了什么显而易见的东西,否则它们似乎并不兼容。我计划明天研究依赖注入、autofac和IComponentRegistration,我迫不及待了...我一定是做错了什么 xD - Hazza
如果它是一个动态创建的脚本,你最好在你的模块中创建一个控制器/操作,输出该脚本,添加一个路由到它,并使用@Url.Action("Action", "Controller")来获取脚本。 - Piotr Szmyd
暂时放一放吧,我认为Orchard不喜欢注入HTTP模块来设置代理中心脚本的预应用程序启动方法。或者类似这样的问题。等我再次感觉头痛难忍时,我会回来处理它。或者我意识到这是显而易见的,而我只是在胡闹。希望是后者。感谢您的建议 :) - Hazza
就目前而言,Orchard和SignalR在一起非常棘手,让它们一起工作并不值得,它们根本不相容。 - Hazza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接