【问题标题】:SignalR kills IIS Express when returning a List of objectsSignalR 在返回对象列表时终止 IIS Express
【发布时间】:2014-08-26 09:59:43
【问题描述】:

我们有一个基于 MongoDB 的跟踪系统和一个 Web 跟踪查看器(ASP.NET 4.0、c#、MVC 4)。此跟踪查看器的选项之一是跟随尾部。我已经通过 javascript 轮询实现了它,但我认为我可以用它来学习 SignalR。

我制作了一个本地副本,将其更新到 .NET 4.5 并通过 nuget(VS 2013)安装了 SignalR。我一直在关注Tutorial: Server Broadcast with SignalR 2 的指南和ASP.NET SignalR Hubs API Guide - Server (C#) 的文档。本指南指出

您可以像在任何 C# 方法中一样指定返回类型和参数,包括复杂类型和数组。您在参数中接收或返回给调用者的任何数据都使用 JSON 在客户端和服务器之间进行通信,SignalR 会自动处理复杂对象和对象数组的绑定

[当您从 Hub 类调用客户端方法时] 您可以为参数指定复杂的类型和数组。

TraceModel 是一个简单的类,其中包含多个公共字符串(如类别、消息、服务器)和创建的 DateTime。我的核心流程是:

IEnumerable<TraceModel> traces = GetTracesTail();
if (traces.Any())
{
    BroadcastTracesTail(traces);
}


private void BroadcastTracesTail(IEnumerable<TraceModel> tail) {
    connectedClients.All.updateTail(tail);
}

当它必须返回一个 IEnumerable 时它会失败(并强制 IIS Express 服务器关闭)(我也尝试过返回一个 List 但它仍然失败)。在以下情况下不会失败:

private void BroadcastTracesTail(IEnumerable<TraceModel> tail) {
    connectedClients.All.updateTail(tail.Count());
}

所以我认为这一定是我的 JSON 解析器或 IIS express 有问题,但我不知道如何测试或修复它。任何帮助将不胜感激。

【问题讨论】:

  • 哦!不,没有抛出异常
  • 你从GetTracesTail()返回什么特别的IEnumerable
  • GetTracesTail 构建一个 List
  • 当您尝试connectedClients.All.updateTail(tail.ToArray()); 时会发生什么?在我的办公室,我们在本地运行时通过 IIS Express 中的 SignalR 返回List&lt;T&gt; 没有问题,但是我们所做的时间通常是在响应(而不是广播)中,当我们在广播中返回它们时,它们通常是响应的属性对象而不是结果本身。

标签: c# asp.net asp.net-mvc-4 signalr


【解决方案1】:

嗯,这是 json 序列化程序和我的短视的问题:我没有意识到我的 TraceModel 有一个不可序列化的 Bson.ObjectId 字段(因为它来自 MongoDB)。我已将其更改为字符串,现在它可以很好地序列化。 感谢 welegan 的 cmets。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 2019-12-29
    相关资源
    最近更新 更多