/ signalr / hubs未在asp.net mvc4中加载:抛出404

时间:2012-09-27 15:13:09

标签: asp.net-mvc-4 http-status-code-404 signalr signalr-hub

这就是我所做的。

  1. 我使用nuget来获取我的MVC4项目的SignalR。
  2. 在我的控制器中创建了一个MyHub类(SignalRTestController.cs)
  3. 在“索引操作”中,尝试从集线器外部广播消息并返回视图。
  4. 在视图中,引用了所有脚本和/ signalr / hub。
  5. 问题是没有找到/ signalr / hubs(抛出404)。

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

    1. MVCProject
        • 子文件夹
          • 控制器
            • SignalRTestController.cs
          • 模型
          • 查看
            • Index.cshtml
      • 控制器
      • 模型
      • 查看
      • 脚本
    2. signalR的所有脚本都在Scripts文件夹中,我的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);
          }
      }
      }
      

      任何我的Index.cshtml都引用了所有的javascripts和/ signalr / hubs,如下所示: //其他Javascripts

      脚本类型=&#34; text / javascript&#34; SRC =&#34; / signalr /集线器&#34; /&GT;

      我认为控制器很好,但我没有得到/ signalr / hubs。它投掷404并且Chrome控制台中的消息是这样的:

      资源解释为脚本但使用MIME类型text / html传输:&#34; http://www.myproject.com/signalr/hubs"。 未捕获的SyntaxError:意外的令牌&lt;集线器:2 Uncaught SignalR:加载集线器时出错。确保您的集线器引用正确,例如 脚本src =&#39; / signalr / hubs&#39;&gt;。

      脚本作为html返回的原因是服务器返回404未找到。

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

      仅供参考:当我创建一个新的空MVC项目并添加signalR并开始处理它时,它完全正常。无需添加路由。

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

7 个答案:

答案 0 :(得分:32)

您是否有对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( “〜/ signalr”)。

答案 1 :(得分:5)

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

[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...
        }
    }
}

答案 2 :(得分:2)

我遇到了同样的问题。这是修复:

Nuget没有添加所有必要的引用。我重申了这个命令:

Install-Package Microsoft.AspNet.SignalR -pre

并添加了一些参考文献:

  • Microsoft.AspNet.SignalR.Hosting.Aspnet
  • Microsoft.AspNet.SignalR.Hosting.Common

一旦完成,它就像一个冠军!

答案 3 :(得分:1)

您的参考问题。执行以下操作:

  1. 在AppStart / Bundle.Config.cs中添加:

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

    @ Scripts.Render( “〜/捆绑/ signalR”)

  3. 在您正在使用signalR的页面上,请确保您像这样引用signalR集线器:

  4. / signalr /集线器

    就像在这个页面上完成的那样: http://blog.devscrum.net/2011/12/getting-started-with-signalr-in-asp-net-mvc/ (部分说:“在index.cshtml中添加以下代码”)

答案 4 :(得分:0)

尝试将[HubName("MyHub")]更改为[HubName("myHub")],并确保在javascript中创建代理的任何位置进行更新。它过去对我有用。

答案 5 :(得分:0)

就我而言,我不小心在不同的位置创建了两个具有相同名称的Hub类(两个派生自Hub的类)。我删除了一个,这一切都有效。

答案 6 :(得分:0)

就我而言,我必须删除web.config appSettings中的一个键:

<add key="owin:AutomaticAppStartup" value="false" />