WinPhone WCF: Ошибка разбора объекта / Ошибка EndInvoke () - PullRequest
3 голосов
/ 23 мая 2011

Я программирую приложение для WindowsPhone, использующее WebService на основе SOAP, с помощью WCF.У меня проблема в том, что что-то с разбором не работает так, как должно работать.Существует сгенерированный класс (Reference.cs), сгенерированный Visual Studio на основе описания службы wsdl.Если я позвоню в сервисный метод и ошибки не будет, все в порядке, запрос отправлен, и я получу ответ.Но если что-то идет не так, запрос отправляется и сервер возвращает объект ошибки.Этот объект называется «ClientException» и определяется файлом wsdl.Проблема заключается в том, что код не может получить возвращаемое значение (ошибка) и не может вернуть исключение.Конкретная база. EndInvoke () завершается ошибкой.Кажется, это проблема winphone / silverlight, протестированная с обычным wcf-клиентом, нет проблем со службой и / или с разбором.

Вот код, который показывает, что я имею в виду:

Код из Reference.cs

        public IAsyncResult BegingetCubeState(AsyncCallback callback, object asyncState)
        {
            object[] _args = new object[0];
            IAsyncResult _result = base.BeginInvoke("getCubeState", _args, callback, asyncState);
            return _result;
        }

        public CubeState EndgetCubeState(IAsyncResult result)
        {
            object[] _args = new object[0];
            Debugger.Break();
            CubeState _result = ((CubeState)(base.EndInvoke("getCubeState", _args, result)));
            return _result;
        }

base.EndInvoke ("getMaxCubeState", _args, result) завершается ошибкой с

InvalidCastException
bei System.ServiceModel.Dispatcher.XmlSerializerObjectSerializer.ReadObject(XmlDictionaryReader reader, Boolean verifyObjectName)
bei System.Runtime.Serialization.XmlObjectSerializer.ReadObject(XmlReader reader, Boolean verifyObjectName)
bei System.Runtime.Serialization.XmlObjectSerializer.InternalReadObject(XmlReaderDelegator reader, Boolean verifyObjectName)
bei System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName)
bei System.Runtime.Serialization.XmlObjectSerializer.ReadObject(XmlDictionaryReader reader)
bei System.ServiceModel.Dispatcher.XmlSerializerFaultFormatter.CreateFaultException(MessageFault messageFault, String action)
bei System.ServiceModel.Dispatcher.FaultFormatter.Deserialize(MessageFault messageFault, String action)
bei System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
bei System.ServiceModel.Channels.ServiceChannel.EndCall(String action, Object[] outs, IAsyncResult result)
bei System.ServiceModel.ClientBase1.ChannelBase1.EndInvoke(String methodName, Object[] args, IAsyncResult result)
bei WindowsPhoneStr.ServiceReferenceSoap.RemoteClient.RemoteClientChannel.EndgetCubeState(IAsyncResult result)
bei WindowsPhoneStr.ServiceReferenceSoap.RemoteClient.WindowsPhoneStr.ServiceReferenceSoap.IRemote.EndgetCubeState(IAsyncResult result)
bei WindowsPhoneStr.ServiceReferenceSoap.RemoteClient.OnEndgetCubeState(IAsyncResult result)
bei System.ServiceModel.ClientBase1.OnAsyncCallCompleted(IAsyncResult result)
bei System.ServiceModel.AsyncResult.Complete(Boolean completedSynchronously)
bei System.ServiceModel.AsyncResult.Complete(Boolean completedSynchronously, Exception exception)
bei System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.CallComplete(Boolean completedSynchronously, Exception exception)
bei System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.FinishSend(IAsyncResult result, Boolean completedSynchronously)
bei System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.SendCallback(IAsyncResult result)
bei System.ServiceModel.AsyncResult.Complete(Boolean completedSynchronously)
bei System.ServiceModel.AsyncResult.Complete(Boolean completedSynchronously, Exception exception)
bei System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.OnGetResponse(IAsyncResult result)
bei System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClassa.<InvokeGetResponseCallback>b__8(Object state2)
bei System.Threading.ThreadPool.WorkItem.doWork(Object o)
bei System.Threading.Timer.ring()

Надеюсь, я объяснил проблему достаточно подробно.Есть ли решение, чтобы решить эту проблему?

Спасибо за ваше время!

1 Ответ

0 голосов
/ 05 сентября 2011

Быстрый взгляд на сообщение об ошибке показывает, что это исключение приведения на стороне клиента, поэтому он недоволен попыткой десериализации объекта на стороне клиента.

Я не могу увидеть wsdl, но похоже, что существует несоответствие между определениями объектов вашего сервера и клиента.Возможно, вы изменили элементы ответного сообщения на сервере, но не обновили клиент.Это также объясняет, почему это работает в ваших тестовых проектах - вы получаете от них правильные справочные данные, в то время как у вашего реального проекта есть старое определение сервиса.

Вы пытались обновить информацию об услуге WCF на clent?(щелкните правой кнопкой мыши по сервису в клиентском проекте и нажмите «Обновить»)

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