在SignalR项目中Json引用冲突

时间:2014-02-21 23:50:51

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

昨天我开始开发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对象。

4 个答案:

答案 0 :(得分:8)

另一个边缘情况,如果您使用signalr.exe ghp ...命令手动生成javascript文件(即用于单元测试等),您可以通过与{类似的工作来解决问题{1}}在上面回答。

只需在与web.config相同的位置创建常规app.config文件(即signalr.exe.config),然后将以下内容放入其中:

signalr.exe

答案 1 :(得分:3)

使用程序集重定向添加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>

答案 2 :(得分:2)

我在项目中收到了相同的错误消息。我的设置看起来像这样:

  • 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)设置为目标框架?

答案 3 :(得分:1)

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

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