2014-03-13 29 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