2011-11-28 139 views
1

我在從服務調用方法時遇到問題。該錯誤只發生在.NET中,Java似乎正常工作。服務中的大多數方法都可以與.NET一起工作,到目前爲止,其中有2個引發了異常。這項服務是開放的,如果你想嘗試重現:http://radar.zhaw.ch/services/AirTrafficWebService.wsdl類型爲「xxx」的對象無法轉換爲「yyy」類型

異常

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(); 

編輯:

的響應似乎是由出同時含有飛機對象和AirplaneTrackingPoint製成的單個對象的列表的列表的(例如[0]飛機,[1]緯度,[2]經度,[3]方位等)。所以看起來.NET正在從列表元素中取出第一個元素並將其用作返回值。 Java似乎忽略了列表中列表的第一個元素,而是使列表中的對象脫離列表的其餘部分。

有人可以解釋這種行爲嗎?

+0

也許你的服務定義改變了一些東西,忘了更新您的服務參考? –

回答

2

您是否更改了服務並忘記更新服務參考?也許早些時候,您返回了一個Airplane對象列表,並且您有時候將其更改爲返回自己的新數據結構。如果右鍵單擊.NET項目中的服務引用,則可以選擇更新它,此時將重新創建爲您執行所有操作的代碼(在Reference.cs中)。

更新:我可以確認它在VS2010中沒有開箱即用。

我試圖在.NET 4和.NET 3.5中運行客戶端。我第一次從內部的SQL查詢字符串中得到一些奇怪的錯誤異常,現在我只是一遍又一遍地得到了轉換錯誤。我遵循標準的VS2010程序來添加一個服務引用,所以服務有可能被指責,或者WSDL不能與svcutil一起工作(這也是一個可能的問題)。

我得到了以下錯誤,當我改變了服務引用始終生成消息協定,並使用這些:

{「評出的XML元素從命名空間‘回報’‘’引用不同類型System.String和AirplaneTrackingTest.AirTraffic.Airplane []。使用XML屬性爲一個或多個元素指定另一個XML名稱或命名空間。「}

我會聯繫服務提供商,並要求正確的測試參數,以他們的方法和他們是否有在C#中的參考客戶端實現。

+0

我已經這麼做了幾次,提供服務的組織已經證實它在大約3年內沒有改變。 – SBoss

+0

我已經更新了我的答案,不幸的是我只能確認它沒有工作。 – Andreas

+0

感謝您的幫助和努力,我正在努力直接獲取XML並解析它。似乎工作到目前爲止,但這是一個滋擾。增加了我發現的新信息。 – SBoss

0

嗨,你需要添加一個演員,假設這兩種類型是兼容的。您將從服務中返回AirplaneTrackingPoints並將它們存儲爲Airplanes,這聽起來有點奇怪。

你的Java方法調用getItem不會出現在你的C#代碼可能是它嗎?

+0

我在調用服務,它是關閉的。我嘗試過使用var和使用動態模式。第二件事是設計差異,.NET直接返回您需要在Java中使用getItem()執行的操作 – SBoss

+0

嗯,我不知道java是如何在這裏工作的,但是我會說把你的列表改成Airplane類型,應該讓它編譯,但是你可能需要循環,儘管把它們轉換成正確的類型。能夠使用適配器模式來使其表現得像你想要的那樣,但不知道代碼是如何難以做到的 –

+0

如果我嘗試接受飛機列表,那麼程序將無法編譯。我已通過Java驗證該服務確實會返回AirplaneTrackingPoint [],而不是Airplane []。 – SBoss

相關問題