我正在使用角度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();
}
}
答案 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.
}