Asp.net mvc 4 /asp.net mvc4中未加载信号器/集线器:抛出404

Asp.net mvc 4 /asp.net mvc4中未加载信号器/集线器:抛出404,asp.net-mvc-4,http-status-code-404,signalr,signalr-hub,Asp.net Mvc 4,Http Status Code 404,Signalr,Signalr Hub,这就是我所做的 我用nuget为我的MVC4项目获取信号机 在我的控制器(SignalRTestController.cs)中创建了一个MyHub类 在索引操作中,尝试从中心外部广播消息并返回视图 在视图中,引用了所有脚本和/信号器/集线器 问题是找不到/信号器/集线器(404) 我的项目有多个区域,结构如下所示: MVC项目 区域 子文件夹 控制器 SignalRTestController.cs 模型 看法 Index.cshtml 控制器 模型 看法 剧本 signal

这就是我所做的

  • 我用nuget为我的MVC4项目获取信号机
  • 在我的控制器(SignalRTestController.cs)中创建了一个MyHub类
  • 在索引操作中,尝试从中心外部广播消息并返回视图
  • 在视图中,引用了所有脚本和/信号器/集线器
  • 问题是找不到/信号器/集线器(404)

    我的项目有多个区域,结构如下所示:

  • MVC项目
    • 区域
      • 子文件夹
        • 控制器
          • SignalRTestController.cs
        • 模型
        • 看法
          • Index.cshtml
    • 控制器
    • 模型
    • 看法
    • 剧本
  • signalR的所有脚本都在脚本文件夹中,我的SignalRTestController.cs如下所示:

    namespace SignalRTest.Controllers
    {
    public class SignalRTestController : Controller
    {
        public ActionResult Index()
        {
            // Do some work here
    
            // Broadcasting over a Hub from outside of a Hub
            var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
            context.Clients.say("Hello SignalR!");
    
           return View();
        }
    }
    
    [HubName("MyHub")]
    public class MyHub : Hub
    {
        public void Say(string message)
        {
            Clients.sendMessage(message);
        }
    }
    }
    
    [assembly: OwinStartupAttribute(typeof(signalr_test.Startup))]
    namespace signalr_test
    {
        public partial class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                ConfigureAuth(app);
                app.MapSignalR(); //can take path also see overloads...
            }
        }
    }
    
    名称空间信号测试控制器
    {
    公共类SignalRTestController:控制器
    {
    公共行动结果索引()
    {
    //在这里做些工作
    //从集线器外部通过集线器进行广播
    var context=GlobalHost.ConnectionManager.GetHubContext();
    context.Clients.say(“Hello signal!”);
    返回视图();
    }
    }
    [HubName(“MyHub”)]
    公共类MyHub:Hub
    {
    公共消息(字符串消息)
    {
    Clients.sendMessage(message);
    }
    }
    }
    
    任何my Index.cshtml都引用了所有Java脚本和/signalr/hub,如下所示: //其他Java脚本

    script type=“text/javascript”src=“/signal/hubs”/>

    我认为控制器很好,但我没有得到/信号器/集线器。它抛出404,Chrome控制台中的消息如下:

    namespace SignalRTest.Controllers
    {
    public class SignalRTestController : Controller
    {
        public ActionResult Index()
        {
            // Do some work here
    
            // Broadcasting over a Hub from outside of a Hub
            var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
            context.Clients.say("Hello SignalR!");
    
           return View();
        }
    }
    
    [HubName("MyHub")]
    public class MyHub : Hub
    {
        public void Say(string message)
        {
            Clients.sendMessage(message);
        }
    }
    }
    
    [assembly: OwinStartupAttribute(typeof(signalr_test.Startup))]
    namespace signalr_test
    {
        public partial class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                ConfigureAuth(app);
                app.MapSignalR(); //can take path also see overloads...
            }
        }
    }
    
    解释为脚本但使用MIME类型text/html传输的资源:http://www.myproject.com/signalr/hubs". 未捕获的语法错误:意外标记<集线器:2 未捕获信号器:加载集线器时出错。确保您的集线器参考是正确的,例如。 脚本src='/signal/hubs'>

    脚本以html形式返回的原因是服务器返回404 not found

    我不确定出了什么问题。我认为这可能是一个路由问题。我不确定,我们是否需要在项目中为/signal/hubs添加任何路由信息,或者我在这里遗漏了什么

    仅供参考:当我创建一个新的空MVC项目并添加signalR并开始工作时,它工作得非常好。无需添加路由


    此外,我在某些地方使用默认路由和属性路由。但是控制器SignalRTestController不使用属性路由。

    尝试将
    [HubName(“MyHub”)]
    更改为
    [HubName(“MyHub”)]
    ,并确保在javascript中创建代理的任何位置都进行更新。这在过去对我很有效。

    你在引用方面有问题。请执行以下操作:

  • 在AppStart/Bundle.Config.cs中添加以下内容:

    bundles.Add(new ScriptBundle("~/bundles/signalR").Include(
        "~/Scripts/jquery.signalR-{version}.js"));
    
  • 在layout.cshtml中添加以下内容:

    bundles.Add(new ScriptBundle("~/bundles/signalR").Include(
        "~/Scripts/jquery.signalR-{version}.js"));
    
    @Scripts.Render(“~/bundles/signalR”)

  • 在您使用signalR的页面上,请确保参考signalR集线器,如下所示:

  • /信号员/集线器

    就像在本页上所做的那样:
    (其中的部分是:“在index.cshtml中添加以下代码”)

    我也遇到了同样的问题。以下是修复方法:

    Nuget没有添加所有必要的引用。我重新运行此命令:

    Install-Package Microsoft.AspNet.SignalR -pre
    
    它还增加了一些参考资料:

    • Microsoft.AspNet.signal.Hosting.AspNet
    • Microsoft.AspNet.signal.Hosting.Common

    一旦这样做了,它就像一个冠军

    您是否调用了RouteTable.Routes.MapHubs()(可能在Global.asax中)?如果是这样,试着摆脱它,看看它是否能解决你的问题皮特11月16日17:22


    我又玩了一会儿。在当前版本中(我得到了最新的源代码,因为我需要一个签名的程序集),您必须调用RouteTable.Routes.MapHubs()。但是为了让它工作,必须首先调用它(或者至少在RouteConfig.RegisterRoutes()调用之前)。如果在那之后调用它,MVC会为它寻找一个控制器,但这不起作用。在我使用的早期版本中,通过nuGet获取,删除RouteTable.Routes.MapHubs()解决了这个问题,但现在似乎是必需的。希望这有帮助皮特11月27日20:53


    显然,您通过将RouteTable.Routes.MapHubs()更改为:
    RouteTable.Routes.MapHubs(“~/signal”)

    在我的例子中,我意外地在不同的位置创建了两个同名的Hub类(两个派生自Hub的类)。我删除了一个,所有的都工作了。

    MapHubs现在已经过时了。在Owin启动类中使用MapSignalR扩展方法,如下所示:

    namespace SignalRTest.Controllers
    {
    public class SignalRTestController : Controller
    {
        public ActionResult Index()
        {
            // Do some work here
    
            // Broadcasting over a Hub from outside of a Hub
            var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
            context.Clients.say("Hello SignalR!");
    
           return View();
        }
    }
    
    [HubName("MyHub")]
    public class MyHub : Hub
    {
        public void Say(string message)
        {
            Clients.sendMessage(message);
        }
    }
    }
    
    [assembly: OwinStartupAttribute(typeof(signalr_test.Startup))]
    namespace signalr_test
    {
        public partial class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                ConfigureAuth(app);
                app.MapSignalR(); //can take path also see overloads...
            }
        }
    }
    

    在我的例子中,web.config appSettings中有一个密钥我必须删除:

    <add key="owin:AutomaticAppStartup" value="false" />
    
    
    
    你解决过这个问题吗?还没有。我们已经从这个sprint中删除了这个任务。我能够在测试项目中使用signalR,但不能在实际项目中使用。我必须再做一次详细的研究。抱歉:(您是否有对RouteTable.Routes.MapHubs()的调用(可能是在Global.asax中)?如果有,请尝试摆脱它,并看看它是否能解决您的问题。我一直在使用它。在当前版本中(我获得了最新的源代码,因为我需要签名程序集),您必须调用RouteTable.Routes.MapHubs().但要让它工作,必须先调用它(或者至少在RouteConfig.RegisterRoutes()调用之前)。如果在调用之后调用它,MVC就会为它寻找控制器,但这不起作用。在我使用的早期版本中,它是通过nuGet获得的,删除RouteTable.Routes.MapHubs()的已努力解决该问题,但现在似乎是必需的。希望这会有所帮助。在我指定RouteTable.Routes.MapHubs(“~/signalr”)。我认为这是一个问题。@Pete您可以将您的注释添加为aswer,以便我可以将其标记为正确并关闭它。这是我所做的,我安装了最新的signalr u