Asp.net mvc 4 根本无法使signar(asp.net mvc4)和require.js一起工作

Asp.net mvc 4 根本无法使signar(asp.net mvc4)和require.js一起工作,asp.net-mvc-4,requirejs,signalr,marionette,Asp.net Mvc 4,Requirejs,Signalr,Marionette,我在网上看到过类似的帖子,但没有人建议我做什么。在这一点上,我真的面临着抛弃其中一个的选择 本“信号器和MVC4入门教程”: 表示您需要两个脚本包括使信号器工作: <!--Reference the SignalR library. --> <script src="~/Scripts/jquery.signalR-1.0.1.js"></script> <!--Reference the autogenerated Signa

我在网上看到过类似的帖子,但没有人建议我做什么。在这一点上,我真的面临着抛弃其中一个的选择

本“信号器和MVC4入门教程”:

表示您需要两个脚本包括使信号器工作:

    <!--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>
如果我想聊天,那么该依赖项将进一步进入应用程序,进入另一个文件中的聊天模块

什么样的

    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”之前的引用路径中,如下所示

尝试删除“?”,但它会从路径中删除我的应用程序名称,如下所示

我想让我去那里的是第一个,没有“?”,比如

我只是不知道该怎么做

最终更新:

生产服务器的最后一个难题是站点的虚拟目录。这是最后一段对我有用的代码。感谢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
    });
然后,您所要做的就是使模块中需要signalr.hubs。即:

require(["signalr.hubs"], function(){
     //your code here
});

我使用@raciel-r的解决方案成功地设置了RequireJS,但是我仍然遇到了其他JavaScript模块的问题,比如karma,这些模块也被动态代理弄糊涂了。我将signalr代理转换为静态文件,并将其与RequireJS一起使用:

  • 导入
    Microsoft.AspNet.signal.Utils

  • 运行
    packages/Microsoft.AspNet.signal.Utils.2.X.X/tools/signal.exe
    ghp/path:my/bin/o:path/to/scripts/server.js
    其中
    /my/bin
    是包含带有信号集线器的程序集的目录

  • 将对
    /signal/hubs
    的引用替换为
    服务器

    requirejs.config({        
    paths: {
         // ...
         "signalr.hubs": "path/to/scripts/server"
    },
    //  ....
    
  • 如果使用生成的代理的方便方法,还必须重写它们(请参阅)


  • 您在服务器上调用MapHubs了吗?请看问题:,它和您遇到的情况正好相反,但应该回答您的问题。是的。是我干的。没有骰子。问题似乎特别在于缺少require.js语法来进行第二次引用,即对自动生成的SignalR hub脚本的引用。我看到人们对语法进行了各种尝试。我都试过了,但没有一个对我有用。下面的那个对我也没用。谢谢。没有骰子。我认为这其中的大部分可能是有效的。我还有一条皱纹,我已经把它添加到我原来的帖子里了。我正在使用这种方法——构建可伸缩的客户端应用程序:()。在该系列的第二部分中,我将实际的信号器代码拆分为一个单独的木偶聊天模块。我想这就是它失败的地方。似乎无法将第二个依赖项(自动生成的脚本)放入单独的聊天模块中。请参阅我的编辑。无论您使用的客户端代码组织和技术如何,这都应该有效。这里棘手的部分(我在集成Signal时遇到了相同的问题)是自动生成的文件,可以通过添加?最后,为了防止出现这种情况,我们需要.js来处理它。我也尝试了noext插件,但没有成功。我所建议的方法是另一个如此愚蠢的家伙向我提出的。Require.js和路径在描述非Require.js方式编写的模块之间的依赖关系方面非常强大,对于您自己的模块,您只需正确定义它们就可以了。我将尝试从一个简单的场景开始,慢慢引入更多的复杂性,以便您了解失败的地方。SignalR可以使用Require.js,事实上,我在一个项目中同时使用了这两个文件。我想他回答了你的问题。感谢你的回答。你有代码建议吗?我已经在上面列出了我的代码。如果你认为这是不正确的,你能具体说明你会改变什么吗?你有signar和require.js工作,但我需要signar、require.js和木偶模块按照我提供的链接中的规定一起工作。如果你已经这样做了,你能给我一些线索,告诉我你是如何将自动生成的依赖项添加到单独的木偶聊天模块中的吗?这似乎确实是故障的确切位置。再次谢谢,我的错。我的开发环境VS 2012缓存了糟糕的结果。即使在上面的代码就位后,仍然会得到未定义的信号器。项目清除浏览器缓存和信号器加载。上面的代码是正确的,适合我。我的单独文件包含了我的木偶聊天模块,它确实获得了依赖性。谢谢你的回答。
    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"] }
        });
    
    require(["signalr.hubs"], function(){
         //your code here
    });
    
    requirejs.config({        
    paths: {
         // ...
         "signalr.hubs": "path/to/scripts/server"
    },
    //  ....