加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-4 – 根本无法使SignalR(asp.net mvc4)和require.js

发布时间:2020-12-16 03:39:50 所属栏目:asp.Net 来源:网络整理
导读:我在网上看过类似的帖子,没有任何人建议为我工作.在这一点上,我真的面临着倾倒一个或另一个的选择. 这个“SignalR和MVC 4入门教程”: http://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr-and-mvc-4 说你需要两个
我在网上看过类似的帖子,没有任何人建议为我工作.在这一点上,我真的面临着倾倒一个或另一个的选择.

这个“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
    });

解决方法

requirejs.config({        
    paths: {
        //core
        "jquery": "jquery-1.9.1","signalr.hubs": "/signalr/hubs?"
    },shim: {
        "jquery": {exports: "$"},"signalr.hubs": { deps: ["signalr"] }
    });

然后,您所要做的就是在模块中使用signalr.hubs.即:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读