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

这就是我做的 .

  • 我用nuget来获取我的MVC4项目的SignalR .

  • 在我的控制器中创建了一个MyHub类(SignalRTestController.cs)

  • 在“索引操作”中,尝试从集线器外部广播消息并返回视图 .

  • 在视图中,引用了所有脚本和/ signalr / hubs .

问题是没有找到/ signalr / hubs(抛出404) .

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

  • MVCProject

  • 地区

  • SubFolder

  • 控制器

  • SignalRTestController.cs

  • 型号

  • 查看

  • Index.cshtml

  • 控制器

  • 型号

  • 查看

  • 脚本

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

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

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

资源解释为脚本但使用MIME类型text / html传输:“http://www.myproject.com/signalr/hubs” . Uncaught SyntaxError:意外的令牌<hubs:2 Uncaught SignalR:加载集线器时出错 . 确保您的集线器引用正确,例如script src ='/ signalr / hubs'> .

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

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

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

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

回答(7)

2 years ago

你有没有调用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”)来解决问题 .

2 years ago

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 years ago

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

Nuget没有添加所有必要的参考文献 . 我重申了这个命令:

Install-Package Microsoft.AspNet.SignalR -pre

并添加了一些参考:

  • Microsoft.AspNet.SignalR.Hosting.Aspnet

  • Microsoft.AspNet.SignalR.Hosting.Common

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

2 years ago

你有参考问题 . 请执行下列操作:

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

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

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

/ signalr /集线器

就像在这个页面上完成的那样:http://blog.devscrum.net/2011/12/getting-started-with-signalr-in-asp-net-mvc/(其中所说的部分:"In index.cshtml add the following code")

2 years ago

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

2 years ago

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

2 years ago

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

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