未找到信号器集线器(403)

时间:2013-05-31 14:32:50

标签: asp.net-mvc-4 signalr iis-express signalr-hub

是的,所以我看到了很多关于此的问题,但没有一个建议的修复对我有用。

我有一个在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>.

显然我已将机器上的实际域名更改为{website}

现在,我最初将它放在我的web项目根目录中名为signalr的文件夹中,其中包含一个子文件夹子集,但是我在SignalR GitHub上读到你不应该这样做,所以我把它改成了'枢纽。仍然没有解决它。

我也看到了关于放置你的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"))
        <br />
        @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 个答案:

答案 0 :(得分:3)

RouteTable.Routes.MapHubs();将您的集线器映射到http:// {website} / signalr / hubs

为什么要尝试从http:// {website} / Hubs获取集线器? 只需从浏览器访问这两个路径,您需要获得包含大量JavaScript代码的http响应。如果这不起作用,则表示您的应用程序配置不正确。

按照这个tutorial,您可以看到RouteTable.Routes.MapHubs()的顺序与您拥有的顺序不同

答案 1 :(得分:0)

根据上面的灵感,我将webconfig更新为:

  

script src ='&lt;%:ResolveClientUrl(“〜/ signalr / hubs”)%&gt;'

而不是

  

script src ='&lt;%:ResolveClientUrl(“〜/ hubs”)%&gt;'类型= “文本/ JavaScript的”

不知道为什么,因为文件夹结构只是〜/ Hubs相对于页面,但它的工作原理...... ZANG !!!!