【问题标题】:SignalR - "Connection was disconnected before invocation result was received" exceptionSignalR - “在收到调用结果之前连接已断开”异常
【发布时间】:2014-04-18 12:12:35
【问题描述】:

为我的公司开发我的第一个 SignalR 原型。

我在尝试调用服务器函数“GetChatUsers”时遇到的问题是,当我通过 JS 调用该方法时,我得到一个异常,“在收到调用结果之前连接已断开”,在服务器之后立即执行“聊天用户”的“返回”。目的。

我正在使用对该方法的同步调用,并且我已逐步执行请求以确保返回一个 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);
        });
    });
};

【问题讨论】:

    标签: signalr signalr-hub


    【解决方案1】:

    答案终于像一吨砖一样击中了我。

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

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

    【讨论】:

    • 这不起作用:返回 UMARepository.Service.ChatService.GetChatUsers().ToList();
    • 我认为如果在返回尝试之前执行了查询,则返回实体集应该不是问题。奇怪,除非返回调用导致在返回的类型中爬取引用。
    • 值得注意的是,如果您执行“dbContext.Configuration.LazyLoadingEnabled = false; dbContext.Configuration.ProxyCreationEnabled = false;”,这应该仍然有效关闭 EF 中的延迟加载/代理类型......但经过测试我发现它没有
    • 这不是我的意思...... IEnumerable 是一个完全有效的对象,可以提供给信号器,但是如果底层类型 T 是一个 ef 代理或 IEnumerable 是一个 DBSet然后 signalR 将无法序列化结果,因为它将有效地尝试爬取您的数据库。拥有 List 不会失败,因为那里有什么并且它无法通过爬取引用来获取更多数据。唯一的例外是递归引用“Item1.Item2.Item1”。你的问题要么是递归,要么是使用代理/延迟加载,把所有这些都去掉,它就会“正常工作”。
    • 这就是说你的答案仍然是正确的,尽管在那个良好的实践中告诉我们不要给前端一个实体......永远!使用适当的 n 层方法,一切都会变得容易:)
    猜你喜欢
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    相关资源
    最近更新 更多