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
- 区域
- 子文件夹
- 控制器
- SignalRTestController.cs
- 模型
- 看法
- Index.cshtml
- 控制器
- 子文件夹
- 控制器
- 模型
- 看法
- 剧本
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中创建代理的任何位置都进行更新。这在过去对我很有效。你在引用方面有问题。请执行以下操作:
bundles.Add(new ScriptBundle("~/bundles/signalR").Include(
"~/Scripts/jquery.signalR-{version}.js"));
bundles.Add(new ScriptBundle("~/bundles/signalR").Include(
"~/Scripts/jquery.signalR-{version}.js"));
@Scripts.Render(“~/bundles/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