是的,所以我看到很多关于这个的问题,但没有一个建议的修复对我有用 .
我有一个在Visual Studio 2012 / IIS Express中运行的MVC4项目,使用SignalR向用户做一些反馈 . 当我运行该项目时,我在Chrome中遇到403错误,如下所示:
Failed to load resource: the server responded with a status of 403 (Forbidden) http://{website}/Hubs/
Uncaught Error: SignalR: Error loading hubs. Ensure your hubs reference is correct, e.g. <script src='/signalr/hubs'></script>.
显然我已经将我的机器上的实际域名更改为
现在,最初我把它放在我的web项目根目录中的一个名为signalr的文件夹中,带有子集的子文件夹,但后来我在SignalR GitHub上读到你不应该那样做,所以我把它改成了'Hubs' . 仍然没有解决它 .
我也看到了关于放置你的RouteTable.Routes.MapHubs()的修复;按正确的顺序 . 我看起来像这样:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteTable.Routes.MapHubs();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
我也看到有些人建议将你的路由作为参数传入MapHubs()方法,但是这需要一个字符串和一个HubConfiguration对象作为参数,这样就不起作用了 .
我的视图代码如下所示:
@using(Html.BeginForm("Report", "Home", FormMethod.Post, new { enctype="multipart/form-data" }))
{
@Html.ValidationSummary(true);
<div>
@(InputExtensions.Hidden(Html, "submittingUserId", ViewBag.CurrentUser))
@(InputExtensions.Hidden(Html, "signalConnectionId"))
@Html.EditorFor(model => model.UploadedFile)
@Html.ValidationMessageFor(model => model.UploadedFile)
</div>
<div>
<input id="subButton" type="submit" value="UploadFile" title="Upload File" />
</div>
}
@section Scripts {
@Scripts.Render("~/Scripts/jquery.signalR-1.1.1.min.js")
@Scripts.Render("~/Hubs")
<script type="text/javascript">
$(document).ready(function () {
var accountMovementMoveHub = $.connection.accountMovementHub;
$("#signalConnectionId").val($.connection.connectionId);
$.connection.hub.updateProgress = function (message) {
$("#progress-list").append('<li>' + message + '</li>');
};
$.connection.hub.start();
});
</script>
}
我还将这些元素添加到web.config:
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true">
</modules>
</system.webServer>
这让我绝对疯了,我已经尝试了我能在这里找到的所有建议,github以及其他任何地方的事情:(
任何帮助将不胜感激!
谢谢
ANSWER
事实证明,我认为/ signalr / hubs的脚本引用是包含集线器的PHYSICAL文件夹 . 它不是;它是对虚拟目录的引用,这就是为什么如果你还有一个名为SignalR的物理文件夹,它会让人感到困惑 . 我将我的hubs文件夹移动到我的业务项目,并将脚本引用设置回“/ signalr / hubs”,这一切都开始工作了 .
抱歉愚蠢的问题,谢谢你的回答 .
2 回答
RouteTable.Routes.MapHubs();将您的集线器映射到http:// / signalr / hubs
你为什么试图从http:// / Hubs获得集线器?只需从浏览器访问这两个路径,您需要获得包含大量JavaScript代码的http响应 . 如果这不起作用,则表示您的应用程序配置不正确 .
按照这个tutorial,您可以看到RouteTable.Routes.MapHubs()的顺序与您拥有的顺序不同
根据上面的灵感,我更新了我的webconfig,看起来像这样:
代替
不知道为什么,因为文件夹结构只是〜/ Hubs相对于页面,但它的工作原理... ZANG !!!!