【问题标题】:SignalR and Database Communication Fails on StartUpSignalR 和数据库通信在启动时失败
【发布时间】:2016-10-24 07:23:48
【问题描述】:

在建立集线器连接的网站中,我调用服务器端函数将用户信息记录到数据库中。数据库中的表用于跟踪用户连接/断开状态。我注意到用户并不总是显示为已连接。因此我认为是因为它没有写入表格。我查了一下,没有行...

我添加了ErrorHandlingPipeline 来捕获错误。我得到的只是Object reference not set to an instance of an object。似乎产生错误的函数是我在前面提到的连接启动时调用的第一个函数。这里是:

public async Task Join()
{
   var user      = GetUser(Context.User.Identity.Name);
   var groupName = user.Group;

   await Groups.Add(Context.ConnectionId, groupName);
   Clients.Group(groupName).addUser(Context.User.Identity.Name);

   // Update group in the db
   using (var db = new UserEntities())
   {
      var connection = db.OnlineUsers.Find(Context.ConnectionId);
      connection.Group = groupName;
      db.SaveChanges();
   }
}

我还在public override Task OnConnected() 中放置了一个断点,但似乎首先调用了Join()?因为它并没有止步于此。 我认为,这就是问题所在,但为什么不会先调用 OnConnected 呢?

这里是枢纽:

   $.connection.hub.start().done(function () {
       // connected
       theHub.server.join();
   });

更新: 看起来问题可能出在 IE11 上,它适用于 FireFox 和 Chrome。这是来自 IE 的控制台日志:

SignalR: webSockets transport starting.
SignalR: Connecting to websocket endpoint 'ws://localhost:1234/signalr/connect?transport=webSockets&clientProtocol=1.5&connectionToken=1234%3connectionData=%a%b&tid=1'.
SignalR: Websocket opened.
SignalR: webSockets transport connected. Initiating start request.
SignalR: The start request succeeded. Transitioning to the connected state.
SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332, keep alive timeout of 20000 and disconnecting timeout of 30000
SignalR: Invoking MyHub.Join
SignalR: Triggering client hub event 'addUser' on hub 'MyHub'.
SignalR: MyHub.Join failed to execute. Error: There was an error invoking Hub method 'MyHub.Join'.
SignalR: Triggering client hub event 'addUser' on hub 'MyHub'.
[SignalR: Triggering client hub event 'addUser' on hub 'MyHub'.
SignalR: Invoking MyHub.GetaddUser

【问题讨论】:

  • 它尝试连接的数据库实例是什么?

标签: c# asp.net-mvc asp.net-mvc-5 signalr


【解决方案1】:

当您订阅集线器时,您的 OnConnected 将被调用,如果没有订阅,OnConnected 将不会首先被触发。您似乎没有订阅中心。

这个问题可能会有所帮助

OnConnected method not called SignalR when I use shared connection in multiple hubs

这里是一些示例代码,用于从您的 JQuery 连接和订阅集线器

C# 中心

[HubName("YourHubName")]
public class YourHubName : Hub
{
    [HubMethodName("Subscribe")]
    public void Subscribe(string groupId)
    {                       
        Groups.Add(Context.ConnectionId, groupId);

        Clients.Group(groupId).addMessageToPage("Sucessfully subscribed to group : " + groupId);
    }
}

这里是 JQuery

var connection = null;
var hub = null;

function initializeHub(signalRServer)
{
    connection = $.hubConnection(signalRServer);
    hub = connection.createHubProxy('YourHubName');
}

function subscribeToHub(groupId)
{
    try
    {
        connection.start(
        { 
            transport: ['webSockets', 'longPolling'], 
            withCredentials: false 
        })
        .done(function ()
        {
            hub.invoke('Subscribe',groupId)
                .done(function () {                
                    console.log("Subscribed");
                })
                .fail(function (error) {
                    console.log('Failed to subscribe');
                });
        })
        .fail(function (error)
        {
            console.log("An error occured with signarR connection : " + error);
        });   

        /*Declared the addMessageToPage method which SignalR will push to*/
        hub.on('addMessageToPage', function (message) {
            console.log("Message received from SignalR server : " + message);
        });         
    }
    catch (e) {
        console.log("An error occured with subscription process");
    }
}

然后,在页面调用Hub

$(document).ready(function () {
    initializeHub("YourSignalRUrlHere"]");
}

当您想触发对中心的订阅时,只需调用

subscribeToHub("HubGroupId");

【讨论】:

  • 我在开始连接之前订阅了集线器,更新了帖子以反映这一点。事实证明,每次在 Firefox 和 Chrome 上都会首先调用 OnConnected。为什么在 IE 11 中没有表现?请参阅 IE11 控制台日志的更新帖子。
  • 这很奇怪,我会做一些研究并回帖
  • 等一下,创建代理时signalRServer 是什么?
  • 指的是专门传入初始化例程的signalrRUrl。这与:<script type="text/javascript" src="~/signalr/hubs"></script> 有关吗?
  • 问题是在布局和视图中使用生成的代理以用于不同的连接。谢谢!
猜你喜欢
  • 2014-07-18
  • 1970-01-01
  • 2016-12-24
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
相关资源
最近更新 更多