2014-03-13 31 views
2

开发我的第一个SignalR原型,用于演示给我公司。SignalR - “接收调用结果前连接断开”例外

问题我试图调用服务器函数'GetChatUsers'时遇到的问题是,当我通过JS调用该方法时,我收到一个异常,'在调用结果收到之前连接断开连接'服务器执行'ChatUser'的'Return'。目的。

我对该方法使用了同步调用,并且我已经逐步完成请求以确保返回一个IEnumerable对象。一旦服务器实际传递给客户端,客户端就会输入方法调用的'.fail'方法,并显示异常。我不知道为什么发生这种情况,但我已经建立了服务器端,类似于如何为“GetAllStocks”的要求建在这里客户方逻辑... http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server

这里是我的服务器代码...

using System.Linq; 
using System.Web; 
using Microsoft.AspNet.SignalR; 
using Microsoft.AspNet.SignalR.Hubs; 
using UMARepository.DataModels; 

namespace UMAChatHub.Service 
{ 
    public class ChatHub : Hub 
    { 
     public IEnumerable<ChatUsers> GetChatUsers() 
     { 
      return UMARepository.Service.ChatService.GetChatUsers(); 
     } 
    } 
} 

JS/JQuery的...

var getChatUsers = function() { 
    var umaChatHubProxy = $.connection.chatHub; 
    umaChatHubProxy.connection.start().done(function() { 
     umaChatHubProxy.server.getChatUsers().done(function(users) { 
      $.each(users, function() { 
       console(this.firstName); 
      }); 
     }).fail(function(ex) { 
      console(ex.message); 
     }); 
    }); 
}; 

回答

4

答案终于打我像一个不依不饶的。

由于我试图返回实体数据对象而不是POCO对象,因此发生了“连接在调用结果被接收之前断开连接”的异常。

我通过创建DTO并使用Automapper从实体映射到DTO对象来解决此问题。我返回了该对象而不是实体对象,并且错误不再发生。

+0

这是行不通的:return UMARepository.Service.ChatService.GetChatUsers()。ToList(); – War

+0

我在考虑如果在返回尝试之前已经执行了查询,那么返回一个实体集应该不成问题。奇怪的是,除非返回调用导致引用在返回类型中被抓取。 – War

+0

值得注意的是,在“dbContext.Configuration.LazyLoadingEnabled = false; dbContext.Configuration.ProxyCreationEnabled = false;”的情况下,这应该仍然有效。关闭EF中的延迟加载/代理类型...但在测试后,我发现它不是 – War