2014-02-21 36 views
4

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

今天,我再次打开它 - 现在它造成问题。

这是我的客户端代码:

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,版本= 6.0.0.0,文化=中立, 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()); 

如果我删除 - 该方法将一直执行到结束,并且客户端超时并从不接收车辆对象。

回答

2

我在我的项目中得到了同样的错误信息。我的设置是这样的:

  • 网络(一个ASP.NET MVC 5项目的意见和网页内容 - 依赖
    • Newtonsoft.Json 5.0.6(从MVC项目模板)
    • WebPresentationModel(C#类库控制器和的ViewModels) - 依赖性
      • Newtonsoft.Json(通过加入的NuGet 6.0.1)

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

+0

我没有一个.NET的问题。 4.5我的意思是Newtonsoft.Json v 4.5 – Inrego

+0

啊,好的。我会尝试卸载 - 包Newtonsoft.Json,干净的项目,并再次尝试安装包。如果您继续收到任何程序集加载错误,我会尝试使用[fusion日志查看器](http://msdn.microsoft.com/zh-cn/library/e74a18c4(v = vs.110).aspx)进行故障诊断。您的项目中是否还有其他项目或依赖项可能依赖于Newtonsoft.Json? –

+0

谢谢汤姆!你带领我正确地检查我的其他项目是否使用了Newtonsoft.Json。我在解决方案中有另一个项目,我从NuGet经理添加了Json,并且使用了最新版本。这导致了signalR项目中需要4.5的冲突。我将依赖项移除到6.0,并添加了对signalR项目使用的相同dll的引用,现在它正在工作。 – Inrego

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> 
+0

我曾使用signalr(与Newtonsoft.Json 4.5编译)从我的dll使用Newtonsoft.Json 6.0生成中心代理(ghp parm)。我不得不用larsm的内容创建signalr.exe.config以避免signalr ghp抛出无法加载异常。 – RockResolve

+0

这不是解决方案,但帮助了我很多。事实上,我直接修改了webconfig文件中的绑定重定向 – Daniel

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工作正常。

7

另一个边缘的情况下,如果你使用signalr.exe ghp ...命令来手动生成的JavaScript文件(即单元测试等),就可以得到解决此问题有类似的工作围绕如上web.config答案。

只需创建在同一个地方一个普通app.config文件(即signalr.exe.config)为signalr.exe,并将以下内容是:

<?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> 
+1

这很好用(Google API需要Newtonsoft 7.0.1之后)。谢谢。 –

+2

Newtonsoft.Json的新版本已经不存在了,我需要将绑定重定向缓冲为使用“8.0.0.0”。 –