我在网上看过类似的帖子,没有人建议为我工作。在这一点上,我真的面临着抛弃一个或另一个的选择。
这是“SignalR和MVC 4入门教程”:
http://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr-and-mvc-4
说你需要两个脚本包括使signalR工作:
<!--Reference the SignalR library. -->
<script src="~/Scripts/jquery.signalR-1.0.1.js"></script>
<!--Reference the autogenerated SignalR hub script. -->
<script src="~/signalr/hubs"></script>
我不知道如何制作第二个,即自动生成的SignalR集线器脚本,发生在require.js中。除非我遗漏了某些东西,否则似乎不是一个可行的require.js语法,用于包含自动生成的脚本。没有它,你会在jquery.signalR-1.1.2.js的第159行得到这个错误:
“JavaScript运行时错误:SignalR:加载集线器时出错。请确保您的集线器引用正确,例如”
jquery.signalR中此时的代码正在执行此操作:
signalR.hub = {
start: function () {
// This will get replaced with the real hub connection start method when hubs is referenced correctly
throw new Error("SignalR: Error loading hubs. Ensure your hubs reference is correct, e.g. <script src='/signalr/hubs'></script>.");
}
};
是否有人通过require.js实际发生了这个自动生成的脚本?
正在研究这一点。让我补充一些细节:
我正在使用这种方法 - 构建可扩展的客户端应用程序:(http://johndavidmathis.wordpress.com/2013/04/23/structuring-scalable-client-side-applications/)以构建更具伸缩性的结构。该系列的第二部分“允许使用多个文件和逻辑文件夹结构的模块”http://johndavidmathis.wordpress.com/2013/04/23/structuring-scalable-client-side-applications/让我将实际的信号器代码分成一个单独的Marionette聊天模块(与我的主app.js文件分开)来实现更好的文件结构。我真的很喜欢这种方法。我的项目的其余部分现在就像这样设置,它在寻找代码方面确实显示出优势。我认为额外的分裂是我被困的地方。似乎无法将第二个依赖项(自动生成的脚本)放入单独的聊天模块文件中。我还在研究这个,但在这一点上我觉得这样。 require.js将依赖项添加到我的Marionette应用程序中:
require(["marionette","handlebars", "signalr", "signalr.hubs"], function (Marionette) {
window.App = new Marionette.Application();
App.addRegions({
headerRegion: "#header",
contentRegion: "#content",
footerRegion: "#footer",
});
require(["modules/main/loader", "modules/chat/loader"], function () {
App.start();
});
})
如果我想让聊天依赖进入应用程序,进入另一个文件的聊天模块?
喜欢什么?
define(dependencies,
function () {
App.module("ChatModule", function (ChatModule, App, Backbone, Marionette, $, _, "signalr.hubs", "signalr.hubs") {
// SignalR Proxy created on the fly
var chat = $.connection.chatHub;
// Start the connection
$.connection.hub.start();
//more chat code...
更新:
以下答案适用于我的开发环境。但是当我将代码发布到真实的生产服务器时,它不起作用。
当代码发布到真实的生产服务器(Windows Server Enterprise 2008 R2上的IIS 6.1)时,浏览器控制台再次显示自动生成的引用的“404”。
具体来说,控制台显示“?”被添加到“.js”之前的参考路径中,就像这样......
http://mydomain.com/myapp/Scripts/application/signalr/hubs?.js ...
试着拿“?”然后它会从路径中删除我的应用名称,就像这样...
http://mydomain.com/signalr/hubs.js
我认为让我在那里的是第一个,没有“?”,就像......
http://mydomain.com/myapp/Scripts/application/signalr/hubs.js
我只是没有看到如何实现这一目标。
最终更新:
生产服务器的最后一块拼图是网站的虚拟目录。这是最终的代码,对我有用。感谢Raciel R的帮助:
requirejs.config({
paths: {
//core
"jquery": "jquery-1.9.1",
"signalr": "jquery.signalR-1.1.2",
"signalr.hubs": "/productionservervirtualdirectory/signalr/hubs?"
},
shim: {
"jquery": {exports: "$"},
"signalr": { deps: ["jquery"] },
"signalr.hubs": { deps: ["signalr"] }
});
//Then all you have to do is to make signalr.hubs required in your modules. Ie:
require(["signalr.hubs"], function(){
//your code here
});
答案 0 :(得分:11)
requirejs.config({
paths: {
//core
"jquery": "jquery-1.9.1",
"signalr": "jquery.signalR-1.1.2",
"signalr.hubs": "/signalr/hubs?"
},
shim: {
"jquery": {exports: "$"},
"signalr": { deps: ["jquery"] },
"signalr.hubs": { deps: ["signalr"] }
});
然后,您所要做的就是在模块中创建signalr.hubs。即:
require(["signalr.hubs"], function(){
//your code here
});
答案 1 :(得分:2)
我使用@ raciel-r的解决方案成功设置了RequireJS,但我仍然遇到其他JavaScript模块的问题,例如karma,这些模块也被动态代理混淆了。我将信号器代理转换为静态文件,并将其与RequireJS一起使用:
导入Microsoft.AspNet.SignalR.Utils
运行packages/Microsoft.AspNet.SignalR.Utils.2.X.X/tools/signalr.exe
ghp /path:my/bin /o:path/to/scripts/server.js
其中/my/bin
是包含SignalR Hub的程序集的目录。
将您的引用替换为/signalr/hubs
server
:
requirejs.config({
paths: {
// ...
"signalr.hubs": "path/to/scripts/server"
},
// ....
如果您使用生成的代理的便捷方法,则还必须重写它们(请参阅 How to create a physical file for the SignalR generated proxy )