Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
发布到IIS服务器时未调用OnDisconnected在Visual Studio中工作正常_Iis_Model View Controller_Signalr_Asp.net Web Api_Signalr Hub - Fatal编程技术网

发布到IIS服务器时未调用OnDisconnected在Visual Studio中工作正常

发布到IIS服务器时未调用OnDisconnected在Visual Studio中工作正常,iis,model-view-controller,signalr,asp.net-web-api,signalr-hub,Iis,Model View Controller,Signalr,Asp.net Web Api,Signalr Hub,如果之前有人问过,请原谅我。我环顾四周,但我遇到的任何问题都没有影响到我的处境 我正在使用信号器2.2.0 设置:我有一个WebAPI2Web应用程序(简称为API),它拥有一个名为ChatHub的中心。我有一个MVC站点(MVC),它在API站点上调用我的中心 这两个站点位于同一台服务器上,只是端口不同。我使用的是VS 2013,当我在本地进行测试时,我的本地系统也使用相同的端口…而且API站点的url是从web配置加载的,这对于发布和调试以及本地来说是不同的(因此url是正确的,服务器上的端

如果之前有人问过,请原谅我。我环顾四周,但我遇到的任何问题都没有影响到我的处境

我正在使用信号器2.2.0 设置:我有一个WebAPI2Web应用程序(简称为API),它拥有一个名为ChatHub的中心。我有一个MVC站点(MVC),它在API站点上调用我的中心

这两个站点位于同一台服务器上,只是端口不同。我使用的是VS 2013,当我在本地进行测试时,我的本地系统也使用相同的端口…而且API站点的url是从web配置加载的,这对于发布和调试以及本地来说是不同的(因此url是正确的,服务器上的端口也很好…真正错误的是OnDisconnected没有被触发)

经过反复尝试和搜索,我终于得到了一个测试应用程序。一切都很顺利。然后,我不得不修改我的中心以适应商业模式。IE获取内存中的用户和消息列表,并将其记录在数据库中(除其他外)。当在本地运行时,一切都能完美地工作,但是一旦站点发布到服务器上的IIS,就永远不会调用OnDisconnected。在本地运行的测试应用程序上,大多数浏览器几乎都会立即点击这个按钮。但即使等待15分钟以上,该方法仍然没有启动

这是我的集线器:(为清晰起见,简称)

//
///聊天中心类
/// 
公共类ChatHubAsync:Hub
{
#区域数据成员
IDemographicsProvider人口统计学provider{get;set;}
IChatRepository Repo{get;set;}
#端区
#区域导体
/// 
///统一构造函数
/// 
[注入构造函数]
公共聊天室异步()
:这(新的ChatRepositoryEF(),DataProviders.Demographics)
{        
}
/// 
///聊天中心的构造函数
/// 
/// 
/// 
公共聊天室异步(IChatRepository存储库,IDemographicsProvider人口统计)
{
Repo=存储库;
人口统计学Provider=人口统计学;
}
#端区
#区域方法
/// 
///关于调用基类的连通方法
/// 
/// 
公共覆盖异步任务OnConnected()
{
wait base.OnConnected();
}
/// 
///连接到集线器
/// 
///空虚
公共异步任务连接()
{
if(wait Repo.GetUser(Context.ConnectionId)==null)
{
等待删除的副本(getGuidFromQueryString(“用户ID”)、getGuidFromQueryString(“组ID”));
var user=wait CreateUser();
等待回购连接(用户);
等待Clients.Caller.onConnected(用户);
}
}
/// 
///将用户添加到组
/// 
/// 
公共异步任务AddToGroup()
{
Guid id=getGroupFromQueryString();
if(id!=Guid.Empty)
{
字符串groupID=id.ToString();
var user=await Repo.GetUser(Context.ConnectionId);
尝试
{
if(user==null)
{
等待连接();
user=wait Repo.GetUser(Context.ConnectionId);
}
wait Groups.Add(Context.ConnectionId,groupID);
var用户=等待回购在线用户(id);
var消息=等待回购检索消息(id,20);
var status=await Repo.AddOnlineUserToGroup(Context.ConnectionId,id);
wait Clients.Caller.onGroupJoined(用户、用户、消息、状态);
Clients.Group(groupID,Context.ConnectionId).onNewUserConnected(用户);
}
捕获(例外E)
{
控制台写入线(E.Message);
}
}
}
///……更多不相关的方法。。。。
/// 
///从轮毂上断开
/// 
/// 
/// 
公共覆盖异步任务OnDisconnected(bool stopCalled)
{
尝试
{
var item=await Repo.GetUser(Context.ConnectionId);
如果(项!=null)
{
if(item.GroupID!=null&&item.GroupID!=Guid.Empty)
{
var id=item.GroupID.ToString();
Repo.Disconnect(Context.ConnectionId);
Clients.OthersInGroup(id).onUserDisconnected(Context.ConnectionId,item.UserName);
Groups.Remove(Context.ConnectionId,id);
}
}
}
捕获(例外E)
{
控制台写入线(E.Message);
}
等待基地断开(停止呼叫);
}
#端区
#区域专用消息
专用异步任务CreateUser()
{
///代码删除
}   
私有Guid getGroupFromQueryString()
{
返回getGuidFromQueryString(“groupID”);
}
私有Guid getGuidFromQueryString(字符串名称)
{
Guid id;
尝试
{
var item=getItemFromQueryString(名称);
if(Guid.TryParse(项目,输出id))
{
返回id;
}
抛出新异常(“不是有效的Guid”);
}
捕获(例外E)
{
控制台写入线(E.Message);
返回Guid.Empty;
}
}
移除的专用异步任务副本(Guid用户、Guid组)
{
///代码删除
}
#端区
}
更新:

我不知道为什么,但一旦我删除了对数据库的调用(对数据库的所有调用)并返回到内存中的列表,在断开连接的情况下,就会再次收到调用

使用straight sql或EntityFramework添加回对数据库的任何调用,OnDisconnected停止被调用

你知道为什么添加数据库调用会导致onDisconnected吗
   /// <summary>
   /// Chat Hub Class
   /// </summary>
   public class ChatHubAsync : Hub
   {
      #region Data Members
      IDemographicsProvider DemographicsProvider { get; set;}
      IChatRepository Repo { get; set; }
      #endregion

      #region CTOR 
      /// <summary>
      /// Unity Constructor
      /// </summary>
      [InjectionConstructor]
      public ChatHubAsync()
         : this(new ChatRepositoryEF(), DataProviders.Demographics)
      {        
      }
      /// <summary>
      /// Constructor for Chat Hub
      /// </summary>
      /// <param name="Repository"></param>
      /// <param name="Demographics"></param>
      public ChatHubAsync(IChatRepository Repository, IDemographicsProvider Demographics)
      {
         Repo = Repository;
         DemographicsProvider = Demographics;
      }
      #endregion

      #region Methods
      /// <summary>
      /// On Connected method to call base class
      /// </summary>
      /// <returns></returns>
      public override async Task OnConnected()
      {
         await base.OnConnected();
      }
      /// <summary>
      /// Connect to Hub
      /// </summary>
      /// <returns>Void</returns>
      public async Task Connect()
      {
         if (await Repo.GetUser(Context.ConnectionId) == null)
         {
            await RemoveDuplicates(getGuidFromQueryString("userID"), getGuidFromQueryString("groupID"));
            var user = await CreateUser();
            await Repo.Connect(user);
            await Clients.Caller.onConnected(user);
         }
      }
      /// <summary>
      /// Add User To Group
      /// </summary>
      /// <returns></returns>
      public async Task AddToGroup()
      {
         Guid id = getGroupFromQueryString();
         if (id != Guid.Empty)
         {
            string groupID = id.ToString();
            var user = await Repo.GetUser(Context.ConnectionId);
            try
            {
               if(user == null)
               {
                  await Connect();
                  user = await Repo.GetUser(Context.ConnectionId);
               }
               await Groups.Add(Context.ConnectionId, groupID);
               var users = await Repo.OnlineUsers(id);
               var messages = await Repo.RetrieveMessages(id, 20);
               var status = await Repo.AddOnlineUserToGroup(Context.ConnectionId, id);
               await Clients.Caller.onGroupJoined(user, users, messages, status);
               Clients.Group(groupID, Context.ConnectionId).onNewUserConnected(user);
            }
            catch(Exception E)
            {
               Console.WriteLine(E.Message);
            }
         }
      }

    /// .....More Methods that are irrelevant....

      /// <summary>
      /// Disconnect from Hub
      /// </summary>
      /// <param name="stopCalled"></param>
      /// <returns></returns>
      public override async Task OnDisconnected(bool stopCalled)
      {
         try
         {
            var item = await Repo.GetUser(Context.ConnectionId);
            if (item != null)
            {
               if (item.GroupID != null && item.GroupID != Guid.Empty)
               {
                  var id = item.GroupID.ToString();
                  Repo.Disconnect(Context.ConnectionId);
                  Clients.OthersInGroup(id).onUserDisconnected(Context.ConnectionId, item.UserName);
                  Groups.Remove(Context.ConnectionId, id);
               }
            }
         }
         catch (Exception E)
         {
            Console.WriteLine(E.Message);
         }
         await base.OnDisconnected(stopCalled);
      }
      #endregion

      #region private Messages

      private async Task<IOnlineUser> CreateUser()
      {
        ///Code removed
      }   

      private Guid getGroupFromQueryString()
      {
         return getGuidFromQueryString("groupID");
      }
      private Guid getGuidFromQueryString(string name)
      {
         Guid id;
         try
         {
            var item = getItemFromQueryString(name);
            if (Guid.TryParse(item, out id))
            {
               return id;
            }
            throw new Exception("Not a Valid Guid");

         }
         catch(Exception E)
         {
            Console.WriteLine(E.Message);
            return Guid.Empty;
         }
      }
      private async Task RemoveDuplicates(Guid User, Guid Group)
      {
         ///Code removed
      }
      #endregion
   }