Объект с типом "xxx" не может быть преобразован в тип "yyy" - PullRequest
1 голос
/ 28 ноября 2011

У меня проблемы с вызовом метода из службы.Ошибка возникает только в .NET, кажется, Java работает нормальноБольшинство методов из службы работают с .NET, до сих пор 2 из них выдавали исключения.Сервис открыт, если вы хотите попробовать и воспроизвести: 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();

РЕДАКТИРОВАТЬ:

Кажется, что ответ составлен из списка, содержащего список как объекта "Самолет", так и отдельных объектов, из которых состоит AirplaneTrackingPoint (например, [0] Самолет, [1] Широта,[2] долгота, [3] подшипник и т. Д.).Похоже, что .NET берет первый элемент из элемента списка и использует его в качестве возвращаемого значения.Java, кажется, игнорирует первый элемент списка в списке и вместо этого делает объект из остальной части списка.

Кто-нибудь может объяснить это поведение?

Ответы [ 2 ]

2 голосов
/ 28 ноября 2011

Вы изменили услугу и забыли обновить ссылку на услугу? Возможно, раньше вы возвращали список Airplane объектов, и некоторое время вы меняли его, чтобы вернуть собственную новую структуру данных. Если щелкнуть правой кнопкой мыши ссылку на службу в вашем проекте .NET, вы можете обновить ее, после чего код, который сделает все за вас (в Reference.cs), будет воссоздан.

ОБНОВЛЕНИЕ: я могу подтвердить, что это не работает из коробки в VS2010.

Я пытался запустить клиент в .NET 4 и .NET 3.5. В первый раз, когда я получил какое-то странное исключение ошибки с сервера со строкой SQL-запроса внутри, теперь я получаю только ошибку приведения снова и снова. Я следовал стандартным процедурам VS2010, чтобы добавить ссылку на службу, поэтому виноват либо служба, либо WSDL не работает с svcutil (также вероятная проблема).

Я получил следующую ошибку, когда изменил ссылку на службу, чтобы всегда создавать контракты сообщений и использовать их:

{"Верхний элемент XML 'return' из пространства имен '' ссылается на отдельные типы System.String и AirplaneTrackingTest.AirTraffic.Airplane []. Используйте атрибуты XML, чтобы указать другое имя XML или пространство имен для элемента или типов."}

Я бы связался с поставщиком услуг и попросил бы предоставить правильные параметры теста для их методов и если у них есть эталонная реализация клиента в C #.

0 голосов
/ 28 ноября 2011

Привет вам нужно добавить в актерский состав, предполагая, что оба типа совместимы.Вы возвращаете AirplaneTrackingPoints из сервиса и сохраняете их как самолеты, это звучит немного странно для меня.

Ваш Java-метод вызывает getItem, которого нет в вашем коде c #, может ли это быть?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...