2011-11-28 23 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(); 

EDIT:応答は飛行機のオブジェクトと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

こんにちは、2つのタイプが互換性があると仮定して、キャストを追加する必要があります。あなたはサービスからAirplaneTrackingPointsを返して、飛行機として保管しています。これは私にとってはちょっと奇妙です。

あなたのJavaメソッドは、あなたのC#コードには存在しないgetItemを呼び出すことができますか?

+0

私はサービスを呼び出している、それは閉じている。私はvarを使用して動的を使用してキャストしようとした.2番目の違いは、デザインの違いです、.NETはあなたがJavaでgetItem() 。 – SBoss

+0

まあ、私はここでどのようにjavaが動作しているのか知りませんが、私はあなたのリストがAirplane型になるように変更すると言っています。それはコンパイルする必要がありますが、正しい型になるように変換してループする必要があります。あなたが望むように動作するようにアダプタパターンを使用することができますが、そのコードがどのようなものであるかはわかりません –

+0

私がAirplaneのリストを受け入れると、プログラムはコンパイルされません。私はJavaから、このサービスがAirplane []ではなくAirplaneTrackingPoint []を返すことを確認しました。 – SBoss

関連する問題