我在移动应用程序中使用SignalR 2.0和.NET客户端,因此我需要处理各种类型的断开连接.有时SignalR客户端在没有我帮助的情况下重新连接 - 有时我必须通过再次调用HubConnection.Start()来重新连接.(因为SignalR在某些时候神奇地自动重新连接,我想知道我是否缺少功能或配置设置)
设置自动重新连接的客户端的最佳方法是什么?我已经看过处理Closed()事件的javascript示例,然后在n秒后连接.有没有推荐的方法?
我已经阅读了有关SignalR连接生命周期的文档和几篇文章,但我仍然不清楚如何处理客户端重新连接.
谢谢!
启动和停止连接到基本自托管服务器的SignalR客户端时,如下所示:
async public void Start(string url)
{
_connection = new HubConnection(url);
_proxy = _connection.CreateHubProxy("hubname");
await _connection.Start().ContinueWith((task) => IsRunning = true);
}
public void Stop()
{
_connection.Stop();
}
Run Code Online (Sandbox Code Playgroud)
调用"Stop"方法(包括跟踪消息)时,我收到以下异常:
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(c75fe282-a86d-406a-935b-5981b47bd472)
SignalR.Transports.TransportHeartBeat Information: 0 : Connection 1bdabc19-e0a7-4649-aabb-bade071ad6d0 is New.
SignalR.Transports.WebSocketTransport Information: 0 : Abort(1bdabc19-e0a7-4649-aabb-bade071ad6d0)
SignalR.Transports.TransportHeartBeat Information: 0 : Removing connection 1bdabc19-e0a7-4649-aabb-bade071ad6d0
SignalR.Transports.WebSocketTransport Information: 0 : End(1bdabc19-e0a7-4649-aabb-bade071ad6d0)
SignalR.Transports.WebSocketTransport Verbose: 0 : DrainWrites(1bdabc19-e0a7-4649-aabb-bade071ad6d0)
SignalR.Transports.WebSocketTransport Information: 0 : CloseSocket(1bdabc19-e0a7-4649-aabb-bade071ad6d0)
App.vshost.exe Error: 0 : Error while closing the websocket: System.Net.WebSockets.WebSocketException (0x80004005): An …Run Code Online (Sandbox Code Playgroud) 我正在使用Asp.Net SignalR 2.
在.net客户端(我使用的是Microsoft.AspNet.SignalR.Client)中,是否需要部署HubConnection?
我尝试过这样做,但需要花费太多时间......
我根本无法弄清楚如何从Angular建立信号发送器连接。
在https://docs.microsoft.com/zh-cn/aspnet/signalr/overview/getting-started/tutorial-getting-started-with-signalr-and-mvc使用以下教程
我SignalR在vs2017中为现有的.Net 4.6解决方案添加了一个新的2.4.0项目。
我也有一个Angular 7应用程序,我SignalR通过它向其中添加了软件包npm install @aspnet/signalr
现在,我试图在客户端和服务器之间建立一个简单的连接,但无法弄清楚如何建立初始连接。
我的前端一直抛出异常:
core.js:15714 ERROR Error: Uncaught (in promise): Error: Cannot send data if the connection is not in the 'Connected' State.
Run Code Online (Sandbox Code Playgroud)
错误:如果连接未处于“已连接”状态,则无法发送数据。
在前端搜索组件中,我添加了一些测试字段:
core.js:15714 ERROR Error: Uncaught (in promise): Error: Cannot send data if the connection is not in the 'Connected' State.
Run Code Online (Sandbox Code Playgroud)
在我的ts文件中:
<mat-form-field>
<input matInput placeholder="message" [(ngModel)]="message">
</mat-form-field>
<button mat-button type="button" (click)="sendMessageToServer()"><span>Send</span></button>
<p *ngFor="let m of messages">{{m}}</p>Run Code Online (Sandbox Code Playgroud)
在C#端,我添加了一个SignalR Hub Class (v2) …
我正在使用ASP.NET MVC 5和SignalR.我想向特定用户发送消息.我已经按照本教程中解释的方法(也是本答案的建议).
我已经覆盖IUserIdProvider,UserId用作connectionId.
public class SignalRUserIdProvider : IUserIdProvider
{
public string GetUserId(IRequest request)
{
// use: UserId as connectionId
return Convert.ToString(request.User.Identity.GetUserId<int>());
}
}
Run Code Online (Sandbox Code Playgroud)
我已对我的应用程序进行了更改Startup以使用上述自定义提供程序:
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
var idProvider = new SignalRUserIdProvider();
GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider), () => idProvider);
ConfigureAuth(app);
app.MapSignalR();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我的客户端可以将目标ClientID传递到集线器,集线器只将消息转发给请求的客户端,这是我的集线器:
[Authorize]
public class ChatHub : Hub
{
public void Send(string message, string destClientId)
{
Clients.User(destClientId).messageReceived(Context.User.Identity.Name + " …Run Code Online (Sandbox Code Playgroud) 我在startup.cs上配置服务器如下
GlobalHost.HubPipeline.RequireAuthentication();
// Make long polling connections wait a maximum of 110 seconds for a
// response. When that time expires, trigger a timeout command and
// make the client reconnect.
GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(40);
// Wait a maximum of 30 seconds after a transport connection is lost
// before raising the Disconnected event to terminate the SignalR connection.
GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromSeconds(30);
// For transports other than long polling, send a keepalive packet every
// 10 seconds.
// This value must …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 SignalR 将通知系统添加到我的 MVC Web 应用程序。我想在控制器中发生某些操作时触发通知。
由于Microsoft 优秀的 SignalR 文档,让 SignalR 2 启动并运行是一件轻而易举的事,但我现在正在努力弄清楚如何更改该代码以使用 Autofac 进行 DI,以便我可以注入集线器,或者允许我的东西访问集线器,进入控制器。
我已经按照Autofac 文档中的示例设置了 Autofac 依赖解析器:
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "ApplicationCookie",
LoginPath = new PathString("/Account/Login"),
CookieName = "fornet"
});
var builder = new ContainerBuilder();
// STANDARD SIGNALR SETUP:
// Get your HubConfiguration. In OWIN, you'll create one
// rather than using GlobalHost.
var config = new HubConfiguration();
// Register your SignalR hubs. …Run Code Online (Sandbox Code Playgroud) 在旧版本的 SignalR 和 .NetFreamwork 中,我使用的类继承了 HubPipelineModule 类,如:
public class IsConnectedPipeLine : HubPipelineModule
{
protected override bool OnBeforeIncoming(IHubIncomingInvokerContext context)
{
if (context.MethodDescriptor.Name == "GetToken")
return true;
return ChatIdentity.CheckToken(context.Hub.Context.GetCurrentUserToken());
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想开始在 .NetCore 2.0 和 SignalR 1.0.0 alpha 2 中进行开发,但我不知道如何在 Web API 控制器中实现管道、中间件或类似 costum ActionAttribute 的东西,我不在乎如何,基本上我需要 OnBeforeIncoming功能。
我搜索并只找到了这篇文章,但它很旧,而不是新版本。
我从 2.4.0 更新了我们的信号器包并添加RunAzureSignalR了RunSignalR. 在 de 中添加了此代码Startup.cs
app.Map("/signalr", map =>
{
var hubConfiguration = new HubConfiguration
{
EnableDetailedErrors = true
};
map.RunAzureSignalR(typeof(Startup).FullName, hubConfiguration, options =>
{
options.ConnectionString = AppApiSettings.SignalRServiceConnectionString;
});
});
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试向集线器发送消息时,出现异常The connection is not active, data cannot be sent to the service.。找不到任何原因会发生这种情况或服务无法运行的原因。
当我使用 RunSignalR(自托管)时,一切运行良好。
任何帮助将不胜感激。
如何在 SignalR 连接设置期间获取其他功能正常的 Web 应用程序中发生的异常的完整堆栈?
我是维护带有 C# 客户端的 Web 应用程序的团队的一员,该应用程序使用极其基本的 SignalR 设置(版本 2.2)在长时间运行的服务器进程期间有效地提供有关进度的推送通知。就像,开箱即用,
app.MapSignalR();
Run Code Online (Sandbox Code Playgroud)
HubConnection connection = new HubConnection(_applicationConfiguration.ApiBaseUri + "/signalr");
await connection.Start();
Run Code Online (Sandbox Code Playgroud)
基本的。我们的一些客户端在远程服务上运行,并定期遇到一个问题,即 Web 应用程序的其他功能工作正常,但调用的客户端代码connection.Start()返回 500 内部服务器错误,没有进一步的信息。他们可以通过刷新远程连接来解决它,但这不太理想,所以我试图获取一些有关连接设置过程中发生此错误的位置的信息。
按照有关在 MSDN 上为 SignalR 设置错误处理的信息,我尝试通过将以下管道模块插入到以下管道模块中来模拟问题GlobalHost.HubPipeline:
public class HubErrorHandlingModule : HubPipelineModule
{
public override Func<IHub, Task> BuildConnect(Func<IHub, Task> connect)
{
throw new InvalidOperationException("Testing Connection Exceptions");
}
protected override void OnIncomingError(ExceptionContext exceptionContext,
IHubIncomingInvokerContext invokerContext)
{
// some logging happens here
base.OnIncomingError(exceptionContext, invokerContext);
}
}
Run Code Online (Sandbox Code Playgroud)
它有点工作,因为我可以看到在管道代码中抛出异常,并且我的测试 C# 客户端也看到 …
我正在使用信号 R 开发聊天应用程序。
我想知道什么时候在信号 r 中使用多个集线器,有什么好处,使用多个集线器还是使用单个集线器是好方法?
我正在尝试在 Typescript 中使用信号器。服务器端是 ASP.NET(不是 ASP.NET CORE)我安装了 signalR(https://www.npmjs.com/package/signalr)和@types/signalr(https://www.npmjs.com/package/ @类型/信号)。
我的导入看起来像这样:
import * as signalR from 'signalr';
Run Code Online (Sandbox Code Playgroud)
问题是我收到了一个错误:“文件 '... /node_modules/@types/signalr/index.d.ts' 不是一个模块。
不知道该怎么办。只有在使用 signalR 库时才会出现这个问题。
signalr-2 ×13
signalr ×7
c# ×6
asp.net-mvc ×4
.net ×2
asp.net ×2
signalr-hub ×2
angular ×1
asp.net-core ×1
autofac ×1
dispose ×1
oauth-2.0 ×1
owin ×1
sockets ×1