类型为“xxx”的对象无法转换为“yyy”类型

时间:2011-11-28 14:54:57

标签: c# java .net soap service

我在从服务调用方法时遇到问题。该错误仅发生在.NET中,Java似乎工作正常。服务中的大多数方法都使用.NET,到目前为止其中有两个方法都抛出了异常。如果您想尝试重现,该服务是开放的:http://radar.zhaw.ch/services/AirTrafficWebService.wsdl

异常

System.ArgumentException occurred
  Message=Das Objekt mit dem Typ "AirTrafficWcfWrapper.ServiceReference1.Airplane[]" kann nicht in den Typ "AirTrafficWcfWrapper.ServiceReference1.AirplaneTrackingPoint[]" konvertiert werden.
  Source=mscorlib
  StackTrace:
    Server stack trace: 
       bei System.RuntimeType.TryChangeType(Object value, Binder binder, CultureInfo culture, Boolean needsSpecialCast)
       bei System.RuntimeType.CheckValue(Object value, Binder binder, CultureInfo culture, BindingFlags invokeAttr)
       bei System.Reflection.RtFieldInfo.InternalSetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture, Boolean doVisibilityCheck, Boolean doCheckConsistency)
       bei System.Reflection.RtFieldInfo.InternalSetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture, Boolean doVisibilityCheck)
       bei System.Reflection.RtFieldInfo.SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture)
       bei System.Reflection.FieldInfo.SetValue(Object obj, Object value)
       bei System.ServiceModel.Dispatcher.OperationFormatter.DeserializeReply(Message message, Object[] parameters)
       bei System.ServiceModel.Dispatcher.ProxyOperationRuntime.AfterReply(ProxyRpc& rpc)
       bei System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
       bei System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
       bei System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
       bei System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
    Exception rethrown at [0]: 
       bei System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
       bei System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
       bei AirTrafficWcfWrapper.ServiceReference1.AirTrafficWebService.getAirplaneTrackingPoints(getAirplaneTrackingPointsRequest request)
       bei AirTrafficWcfWrapper.ServiceReference1.AirTrafficWebServiceClient.AirTrafficWcfWrapper.ServiceReference1.AirTrafficWebService.getAirplaneTrackingPoints(getAirplaneTrackingPointsRequest request) in D:\Projekte\C#\WP7\Airtraffic\Tests\SilverlightDesktop\AirTrafficWcfWrapper\Service References\ServiceReference1\Reference.cs:Zeile 1234.
  InnerException: 

它在生成的Reference.cs文件中抛出,如下所示:

    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    AirTrafficWcfWrapper.ServiceReference1.getAirplaneTrackingPointsResponse AirTrafficWcfWrapper.ServiceReference1.AirTrafficWebService.getAirplaneTrackingPoints(AirTrafficWcfWrapper.ServiceReference1.getAirplaneTrackingPointsRequest request) {
        return base.Channel.getAirplaneTrackingPoints(request); //<--HERE
    }

.NET调用:

AirplaneTrackingPoint[] tps = _airTrafficService.getAirplaneTrackingPoints(icao, 0, 0, false);

Java调用:

List<AirplaneTrackingPoint> tps = service.getAirplaneTrackingPoints(icao, 0, 0, false).getItem();

修改

响应似乎是由一个列表组成,其中包含Airplane对象和AirplaneTrackingPoint组成的单个对象的列表(例如[0] Airplane,[1] Latitude,[2] Longitude,[3] ]轴承等)。因此,似乎.NET正在从列表元素中取出第一个元素并将其用作返回值。 Java似乎忽略了列表中列表的第一个元素,而是将一个对象从列表的其余部分中删除。

有人可以解释这种行为吗?

2 个答案:

答案 0 :(得分:2)

您是否更改了服务但忘记更新服务参考?也许早些时候您返回了Airplane个对象的列表,有时您更改它以返回自己的新数据结构。如果右键单击.NET项目中的服务引用,则可以选择更新它,此时将重新创建为您执行所有操作的代码(在Reference.cs中)。

更新:我可以确认它在VS2010中没有开箱即用。

我尝试在.NET 4和.NET 3.5中运行客户端。我第一次从服务器中得到一些奇怪的错误异常,里面有一个SQL查询字符串,现在我只是一遍又一遍地得到强制转换错误。我遵循标准的VS2010程序来添加服务引用,因此要么是服务要么责备,要么WSDL不能用于svcutil(也是一个可能的问题)。

当我将服务引用更改为始终生成消息协定并使用以下内容时出现以下错误:

  

{“命名空间中的顶级XML元素'return''引用不同类型System.String和AirplaneTrackingTest.AirTraffic.Airplane []。使用XML属性为元素指定另一个XML名称或命名空间。”} < / p>

我会联系服务提供商,询问他们的方法是否有正确的测试参数,以及他们是否在C#中有参考客户端实现。

答案 1 :(得分:0)

您好需要添加一个演员,假设这两种类型是兼容的。您正在从服务中返回AirplaneTrackingPoints并将其存储为Airplanes,这对我来说听起来有点奇怪。

你的Java方法调用了你的c#代码中没有的getItem吗?