发布到IIS服务器时未调用OnDisconnected在Visual Studio中工作正常
如果之前有人问过,请原谅我。我环顾四周,但我遇到的任何问题都没有影响到我的处境 我正在使用信号器2.2.0 设置:我有一个WebAPI2Web应用程序(简称为API),它拥有一个名为ChatHub的中心。我有一个MVC站点(MVC),它在API站点上调用我的中心 这两个站点位于同一台服务器上,只是端口不同。我使用的是VS 2013,当我在本地进行测试时,我的本地系统也使用相同的端口…而且API站点的url是从web配置加载的,这对于发布和调试以及本地来说是不同的(因此url是正确的,服务器上的端口也很好…真正错误的是OnDisconnected没有被触发) 经过反复尝试和搜索,我终于得到了一个测试应用程序。一切都很顺利。然后,我不得不修改我的中心以适应商业模式。IE获取内存中的用户和消息列表,并将其记录在数据库中(除其他外)。当在本地运行时,一切都能完美地工作,但是一旦站点发布到服务器上的IIS,就永远不会调用OnDisconnected。在本地运行的测试应用程序上,大多数浏览器几乎都会立即点击这个按钮。但即使等待15分钟以上,该方法仍然没有启动 这是我的集线器:(为清晰起见,简称)发布到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是正确的,服务器上的端
//
///聊天中心类
///
公共类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
}