这就是我所做的。
问题是没有找到/ signalr / hubs(抛出404)。
我的项目有区域,结构如下所示:
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不使用属性路由。
答案 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
并添加了一些参考文献:
一旦完成,它就像一个冠军!
答案 3 :(得分:1)
您的参考问题。执行以下操作:
在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/ (部分说:“在index.cshtml中添加以下代码”)
答案 4 :(得分:0)
尝试将[HubName("MyHub")]
更改为[HubName("myHub")]
,并确保在javascript中创建代理的任何位置进行更新。它过去对我有用。
答案 5 :(得分:0)
就我而言,我不小心在不同的位置创建了两个具有相同名称的Hub类(两个派生自Hub的类)。我删除了一个,这一切都有效。
答案 6 :(得分:0)
就我而言,我必须删除web.config appSettings中的一个键:
<add key="owin:AutomaticAppStartup" value="false" />