【问题标题】:Signalr Hubs Not found (403)未找到信号器集线器 (403)
【发布时间】:2016-12-01 00:02:09
【问题描述】:

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

我有一个在 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 的文件夹中,其中包含一个 hubs 子文件夹,但后来我在 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和其他任何地方能找到的所有建议:(

任何帮助将不胜感激!

谢谢

回答

事实证明,我假设对 /signalr/hubs 的脚本引用指向包含集线器的 PHYSICAL 文件夹。它不是;它是对虚拟目录的引用,这就是为什么如果您还有一个名为 SignalR 的物理文件夹,它会感到困惑。我将 hubs 文件夹移到了我的业务项目中,并将脚本引用设置回“/signalr/hubs”,一切都开始工作了。

抱歉这个愚蠢的问题,感谢您的回答。

【问题讨论】:

  • 看起来你有一个斜杠??? http://{网站}/Hubs/
  • 我认为这只是 Chrome 的控制台添加了最后一个斜线。错误来自视图中的脚本引用,即引用“~/Hubs”
  • 您查看了源代码并确认了吗?只是一个想法。
  • 我确实有 :) 来源说
  • 我认为如果出于某种原因它是跨域调用,或者如果您的项目中有一个名为 hubs 的文件夹,您也会得到 403。

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


【解决方案1】:

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

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

关注这个tutorial,你可以看到RouteTable.Routes.MapHubs()的顺序和你的不一样

【讨论】:

    【解决方案2】:

    根据上面的灵感,我将 webconfig 更新为如下所示:

    script src=''

    而不是

    script src='' type="text/javascript"

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-31
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      相关资源
      最近更新 更多