【问题标题】:Json reference conflict in SignalR projectSignalR 项目中的 Json 引用冲突
【发布时间】:2014-02-21 23:50:51
【问题描述】:

昨天我开始开发 SignalR 应用程序 - 我创建了 2 个不同的项目(服务器和客户端),一切顺利。

今天,我再次打开它 - 现在它引起了问题。

这是我的客户端代码:

signalrHub.client.updateVehicle = function (dbVehicle) {
    $.each(Vehicles, function() {
        var vehicle = this;
        if (vehicle.id == dbVehicle.id && vehicle.dataset == dbVehicle.dataset) {
            vehicle.move(dbVehicle.latitude, dbVehicle.longitude);
        }
    });
};
$.connection.hub.url = "http://localhost:52522/signalr";
signalrHub = $.connection.routeHub;
$.connection.hub.start().done(function() {
    signalrHub.server.joinDataset("JR");
    signalrHub.server.getVehicles("JR").done(function (response) {
        $.each(response.vehicles, function() {
            Vehicles.push(new Vehicle(this));
        });
        $.each(Vehicles, function() {
            this.addToMap();
        });
    }).fail(function(error) {
        alert(error);
    });
});

调用失败处理程序,出现以下错误: 无法加载文件或程序集“Newtonsoft.Json,Version=6.0.0.0,Culture=neutral,PublicKeyToken=30ad4fe6b2a6aeed”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)

我已尝试将 Newtonsoft.Json 更新到 6.0 - 但在查找 4.5 版本时出现编译错误。

这是服务器端的 GetVehicles:

public async Task<Vehicles> GetVehicles(string dataset)
{
    var vehicles = await Vehicles.GetData(dataset, DateTime.Today, DateTime.Today.AddDays(1));
    Clients.Caller.updateVehicle(vehicles.Data.First());
    return vehicles;
}

这是失败的那一行:

Clients.Caller.updateVehicle(vehicles.Data.First());

如果我删除它 - 该方法将一直执行到最后,并且客户端超时并且永远不会收到 Vehicles 对象。

【问题讨论】:

    标签: c# .net json json.net signalr


    【解决方案1】:

    另一个极端情况,如果您使用 signalr.exe ghp ... 命令手动生成 javascript 文件(即用于单元测试等),您可以通过与上述 web.config 答案类似的工作来解决此问题.

    只需在signalr.exe 所在的位置创建一个常规的app.config 文件(即signalr.exe.config),并将以下内容放入其中:

    <?xml version="1.0"?>
    <configuration>
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
            <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
    </configuration>
    

    【讨论】:

    • 这很好用(在 Google API 需要 Newtonsoft 的 7.0.1 之后)。谢谢。
    • Newtonsoft.Json 的新版本已经发布,我需要调整绑定重定向以使用“8.0.0.0”。
    【解决方案2】:

    添加带有程序集重定向的app.config,即:

    <?xml version="1.0"?>
    <configuration>
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <!-- Redirect SignalR JSON -->
            <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
            <bindingRedirect oldVersion="4.5.0.0-6.0.0.0" newVersion="6.0.0.0" />
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
      </startup>
    </configuration>
    

    【讨论】:

    • 我使用 Signalr(使用 Newtonsoft.Json 4.5 编译)从我的使用 Newtonsoft.Json 6.0 的 dll 生成集线器代理(ghp parm)。我必须使用 larsm 的内容创建一个 signalr.exe.config 以避免 signalr ghp 抛出无法加载异常。
    • 这不是解决方案,但对我帮助很大。其实我直接修改了webconfig文件中的绑定重定向
    【解决方案3】:

    我在我的项目中收到了相同的错误消息。我的设置如下所示:

    • Web(用于视图和 Web 内容的 ASP.NET MVC 5 项目 - 依赖关系
      • Newtonsoft.Json 5.0.6(来自 MVC 项目模板)
      • WebPresentationModel(用于控制器和视图模型的 C# 类库)-依赖关系
        • Newtonsoft.Json(通过 NuGet 添加到 6.0.1)

    所以在我通过 NuGet 将我的“Web”项目更新到 Newtonsoft.Json 6.0.1 后,错误就消失了。也许您对引用不同版本的 Newtonsoft 的不同项目有类似的问题?看起来 .NET 4.5 现在真的是你的问题了。您是否在项目属性中将 .NET Framework 4.5(或 4.5.1)设置为目标框架?

    【讨论】:

    • 我没有 .NET 问题。 4.5 我的意思是 Newtonsoft.Json v 4.5
    • 啊,好的。我会尝试 Uninstall-Package Newtonsoft.Json,清理项目并再次尝试 Install-Package。如果您继续遇到任何程序集加载错误,我会尝试使用fusion log viewer 进行故障排除。您的项目中是否有任何其他项目或依赖项可能依赖于 Newtonsoft.Json?
    • 谢谢汤姆!您将我引导到正确的方向,以检查我的任何其他项目是否正在使用 Newtonsoft.Json。我在解决方案中确实有另一个项目,我从 NuGet 管理器添加了 Json,它采用了最新版本。这导致了需要 4.5 的 signalR 项目中的冲突。我删除了对 6.0 的依赖,并添加了对与 signalR 项目使用的相同 dll 的引用,现在它可以工作了。
    【解决方案4】:

    毫无疑问,这只是一个临时的边缘情况,但我在 Windows 10 预览版中遇到了完全相同的问题(System.IO.FileLoadException:无法加载文件或程序集“Newtonsoft.Json”) - Visual Studio 2015 RC组合......原来我在我的解决方案中使用了Newtonsoft Json(v7.0.1 beta)的预发布版本。

    为了解决这个问题,我通过 NuGet 降级到 Newtonsoft Json v6.0.8,然后 ghp 工作正常。

    【讨论】:

      猜你喜欢
      • 2023-04-05
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 2012-08-05
      • 1970-01-01
      相关资源
      最近更新 更多