SignalR:加载集线器时出错。找不到404

时间:2018-06-28 13:11:43

标签: c# signalr

我正在使用角度5应用程序,正在尝试实现SignalR。而且我得到了2个我想都一样的错误。首先是:

  

无法加载资源:服务器的响应状态为404(未找到)

第二个是:

  

ERROR错误:SignalR:加载集线器时出错。确保您的集线器引用正确无误,例如

也就是说,我一直在进行研究,并且看到了一些选择,这些选择主要引用了较旧版本的siganalR。

我已遵循Tutorial并添加了一个集线器

[HubName("EventContractHub")]
public class EventContractHub : Hub, IClientHub
{
    public void SendId(int id)
    {
        Clients.All.Send(id);
    }
}

带有一个看起来像...的Startup.cs

[assembly:OwinStartUp(typeof(blah.Startup))]
namespace blah
{
   public class Startup
   {
      public void Configuration(IAppBuilder app)
      {
          // Other configuration here
          app.MapSignalR();
      }
   }
}

我的_Layout.cshtml的引用看起来像:

<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/jquery.signalR-2.2.3.min.js"></script>
<!--Reference the autogenerated SignalR hub script. -->
<script src="~/signalr/hubs"></script>

有人知道为什么现在会发生这种情况吗?

找不到404的网址是:http://localhost/IntelliM/signalr/hubs

我应该提到,我也使用Owin在同一台服务器上运行api。我不知道这是否会改变任何事情。如果是这样,我也可以发布该配置。

请理解,我不得不在这里删除一些代码,我留下了相关的代码:

   public void Configuration(IAppBuilder app)
    {

        if (/*Logic for License*/)
        {
            app.Map("/identity", ssocf =>
            {

            });
        }



        JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>();

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = "Cookies"
        });



        app.UseOpenIdConnectAuthenticationPatched(new OpenIdConnectAuthenticationOptions
        {


            SignInAsAuthenticationType = "Cookies",

            Notifications = new OpenIdConnectAuthenticationNotifications
            {
                AuthorizationCodeReceived = async n =>
                {

                    /*
                     * Add Clams here
                     */
                },

                SecurityTokenValidated = async n =>
                {

                        /*Create Token Here*/
                },

                RedirectToIdentityProvider = n =>
                {

                }
            }
        });


        //Setting WebAPI Auth
        var config = new HttpConfiguration();
        config.Formatters.Remove(config.Formatters.XmlFormatter);
        //config.SuppressDefaultHostAuthentication();

        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
        app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
        {
            Authority = authority
        });

        app.UseWebApi(config);
        app.MapSignalR();
    }

}

1 个答案:

答案 0 :(得分:1)

检查链接教程中的注释

  

重要

     

将SignalR和其他脚本库添加到Visual Studio项目时,程序包管理器可能会安装SignalR脚本文件的版本,该版本比本主题中显示的版本更新。确保代码中的脚本引用与项目中安装的脚本库的版本匹配。

因此,请首先确保您引用了正确的版本。

考虑将SignalR相关引用添加到包中

public class BundleConfig {
    public static void RegisterBundles(BundleCollection bundles) {
        //... other bundles

        bundles.Add(new ScriptBundle("~/bundles/jquery")
            .Include("~/Scripts/jquery-{version}.js"));        

        bundles.Add(new ScriptBundle("~/bundles/signalr").Include(
            "~/Scripts/jquery.signalr-*", //the * wildcard will get script regardless of version
            "~/signalr/hubs"));

        //Enable minification
        BundleTable.EnableOptimizations = true;
    }
}

//...in start up
BundleConfig.RegisterBundles(BundleTable.Bundles);

并在视图中

<!-- javascript: Placed at the end of the document so the pages load faster -->
@Scripts.Render("~/bundles/jquery", "~/bundles/signalr")

从路由角度来看,您还想确保在添加到混合项目中时没有其他冲突的路由,因为添加到中间件管道中的顺序会影响到集线器的路由。

例如

public void Configuration(IAppBuilder app) {
    //Auth
    this.ConfigureAuth(app);

    //SignalR 
    app.MapSignalR();

    //...other configuration.
}