目前我有一个非常健谈的应用程序,需要单例支持(见下面的代码)。我升级到 SignalR 2.0 并遵循了升级指南,但是在将其部署到环境中后,有时对每个“协议”的所有请求都会失败,并且信号器中断,当它没有中断时,推送速度非常慢从服务器到客户端的通知,也许这与使用长轮询有关?这是我的服务器端代码的样子。
Owin启动类中的配置方法
var hubConfig = new HubConfiguration();
hubConfig.EnableDetailedErrors = true;
GlobalHost.DependencyResolver.UseSqlServer(ConfigurationManager.AppSettings["ConnectionString"].ToString());
app.MapSignalR(hubConfig);
Run Code Online (Sandbox Code Playgroud)
如您所见,我使用的是 SQL 背板。这是我的集线器的样子
public class MyHub : Hub
{
public void JoinGroup(int someId)
{
Groups.Add(Context.ConnectionId, someId.ToString());
}
public void LeaveGroup(int someId)
{
Groups.Remove(Context.ConnectionId, someId.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
这里要说明的另一点是我正在使用组。这可能是问题的一部分,我注意到组似乎使事情变得更慢,好像信号器在推送通知后正在等待组中的所有用户完成。我的单身人士看起来像这样。
public class Broadcaster
{
private readonly static Lazy<Broadcaster> _instance =
new Lazy<Broadcaster>(() => new Broadcaster(GlobalHost.ConnectionManager.GetHubContext<MyHub>().Clients));
private IHubConnectionContext _context;
private Broadcaster(IHubConnectionContext context)
{
_context = context;
}
public static Broadcaster Instance
{
get { return _instance.Value; }
}
public …Run Code Online (Sandbox Code Playgroud) 我正在为我的 SignalR 服务器创建一个集线器类,并希望使用一种通用方法来避免大量代码行。但是,当我尝试从同样在 C# 中的 Xamarin.iOS 客户端调用下面的服务器代码时,SignalR 给了我错误。
服务器代码
public List<T> SendDataToClient<T>() where T : BusinessEntityBase
{
return SomeDBManager.GetItems<T>();
}
Run Code Online (Sandbox Code Playgroud)
客户代码
var list = await hubProxy.Invoke<List<Article>>("SendDataToClient");
Run Code Online (Sandbox Code Playgroud)
我在这里做错了什么还是在 SignalR 集线器中使用泛型方法是不可能的?
当其他 exe 位于同一文件夹中时,我的 WebApp.Start 方法会引发 System.IO.FileLoadException。我不知道为什么会发生这种情况,这让我发疯。任何帮助表示赞赏。
//Calling webapp.start
string url = "http://*:8080/";
SignalRServer = WebApp.Start(url);
//My Owin Startup Class
class Startup
{
public void Configuration(IAppBuilder app)
{
// Branch the pipeline here for requests that start with "/signalr"
app.Map("/signalr", map =>
{
map.UseCors(CorsOptions.AllowAll);
var hubConfiguration = new HubConfiguration
{
EnableJSONP = false,
EnableDetailedErrors = true,
EnableJavaScriptProxies = true
};
map.RunSignalR(hubConfiguration);
});
}
}
Run Code Online (Sandbox Code Playgroud)
这一直很好,直到我将服务投入生产部署测试,现在它出现以下错误。
System.IO.FileLoadException: Could not load file or assembly 'AutoServiceController, Version=1.0.5270.19403, Culture=neutral, PublicKeyToken=null' or one of its dependencies. …
我有一个ASP.NET WebAPI项目.我正在使用Bearer Tokens来验证我的用户.我的一些控制器操作标有[Authorized]过滤器.在客户端,客户端通过调用http://foo.bar/Token然后将该令牌添加Authorization为其请求的标头来获取其令牌.
到目前为止没有问题,并且我的Startup.Auth.cs课程中的所有设置都应该正常工作:
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId),
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
// In production mode set AllowInsecureHttp = false
AllowInsecureHttp = true
};
// Enable the application to use bearer tokens to authenticate users
app.UseOAuthBearerTokens(OAuthOptions);
Run Code Online (Sandbox Code Playgroud)
现在我已经为我的项目添加了一些SignalR Hubs,我也想在集线器中验证用户身份.还有一些其他问题涉及客户端如何向SignalR连接添加承载令牌.摘要:
OAuth Provider并将标记作为查询字符串传递.也不鼓励这种方法,因为它可能成为安全问题.但我仍然想使用这种方法,因为我不想要Long Polling.所以我创建了这个类来从查询字符串中检索我的访问令牌. …
我想向所有连接的客户端发送某种计时器到服务器。我可以通过单击按钮来执行此操作。但我真正需要的是每秒自动发送这个计时器。
HTML
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Signalr Chat Messenger</title>
<script src="Scripts/jquery-1.6.4.min.js" type="text/javascript"></script>
<script src="Scripts/jquery.signalR-1.0.0-rc1.js" type="text/javascript"></script>
<script src="signalr/hubs" type="text/javascript"></script>
</head>
<body>
<form id="form1" runat="server">
<script type="text/javascript">
$(function () {
var IWannaChat = $.connection.myChatHub;
IWannaChat.client.addMessage = function (message) {
$('#listMessages').append('<li>' + message + '</li>');
};
IWannaChat.client.addTest = function (timer) {
$('#lblTimer').text(timer);
};
$("#SendMessage").click(function () {
IWannaChat.server.send($('#txtMessage').val());
});
$.connection.hub.start();
});
</script>
<div>
<input type="text" id="txtMessage" />
<input type="button" id="SendMessage" value="broadcast" /><asp:Label ID="lblTimer" runat="server" Text="timer"></asp:Label>
<ul id="listMessages">
</ul>
</div>
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
这是我的HUB …
所以我对 SignalR 很陌生,事实上我现在只使用了几天。无论如何,当我的应用程序首次启动时,我收到以下错误:
相关应用程序的代码位于两个项目中,一个 Web API 和一个单页应用程序 (SPA)。第一个是我的后端代码 (C#),第二个是我的客户端代码 (AngularJS)。我认为问题可能是由于相关项目在不同的端口上运行。我的 SignalR 集线器所在的 Web API 位于端口 60161 上,SPA 位于 60813 上。我的集线器声明如下:
public class ReportHub : Hub
{
public void SendReportProgress(IList<ReportProgress> reportProgress)
{
this.Clients.All.broadcastReportProgress(reportProgress);
}
public override Task OnConnected()
{
this.Clients.All.newConnection();
return base.OnConnected();
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我的 Web API 的 Startup.cs 文件中,我像这样初始化 SignalR:
public void Configuration(IAppBuilder app)
{
HttpConfiguration config = new HttpConfiguration();
config.Services.Replace(typeof(IHttpControllerActivator), new NinjectFactory());
config.MessageHandlers.Add(new MessageHandler());
//set up OAuth and Cors
this.ConfigureOAuth(app);
config.EnableCors();
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
// Setting up SignalR
app.Map("/signalr", …Run Code Online (Sandbox Code Playgroud) 我的 SignalR 项目遇到了问题。我创建了一个控制台来运行 SignalR,然后尝试在我的网站上使用它(目前都以 localhost 模式运行)
信号自主机
using System;
using Microsoft.AspNet.SignalR;
using Microsoft.Owin.Hosting;
using Owin;
using Microsoft.Owin.Cors;
using Microsoft.AspNet.SignalR.Hubs;
namespace SignalRSelfHost
{
class Program
{
static void Main(string[] args)
{
// This will *ONLY* bind to localhost, if you want to bind to all addresses
// use http://*:8080 to bind to all addresses.
// See http://msdn.microsoft.com/en-us/library/system.net.httplistener.aspx
// for more information.
string url = "http://localhost:8080";
using (WebApp.Start(url))
{
Console.WriteLine("Server running on {0}", url);
Console.ReadLine();
}
}
}
class Startup
{
public …Run Code Online (Sandbox Code Playgroud) 我正在使用信号 R 开发聊天应用程序。
我想知道什么时候在信号 r 中使用多个集线器,有什么好处,使用多个集线器还是使用单个集线器是好方法?
我想知道信号器是否更改了 OnReconnected 方法上的 connectionId?因为我正在将用户列表映射到他们的连接 ID,所以如果由于连接缓慢而在服务器上引发了重新连接的事件,例如 connectionId 会改变吗?
我在 Angular6 中开发了一个项目。需要为实时聊天开发部分。为此,我在我的 asp.net 核心 Web Apiproject 中使用 SignalR。现在我想在我的 Angular 项目中使用这个 Web Api 参考。
我正在使用此链接。
但是在 App.Component.ts 中提供 Web Api url 时,我收到以下错误:
“HubConnection”类的构造函数是私有的,只能在类声明中访问。
应用组件.ts:
import { HubConnection } from '@aspnet/signalr';
import { Message } from 'primeng/api';
export class AppComponent implements OnInit {
public _hubConnection: HubConnection;
msgs: Message[] = [];
constructor() {
}
ngOnInit() {
this._hubConnection = new HubConnection('http://localhost:1874/notify'); // getting error on this line.
Run Code Online (Sandbox Code Playgroud)
编辑:尝试以下代码:-
修改后的 App.Component.ts :
import { HubConnection } from '@aspnet/signalr';
import * as …Run Code Online (Sandbox Code Playgroud)