Проблема с десерализацией Silverlight 4 и WCF - произошла ошибка десериализации объекта типа «T».Неожиданный конец файла - PullRequest
0 голосов
/ 01 мая 2011

Я столкнулся с большой проблемой, которая у меня возникла, которая внезапно обнаружилась, когда я обновил свои Silverlight & Web Projects до версии 4 соответственно.

После этого все мои службы WCF перестают работать со следующим сообщением об ошибке:

Произошла ошибка при десериализации объекта типа Anyboat.Admin.UserService.User. Неожиданный конец файла. Следующие элементы не закрываются: LastName, AuthenticateUserResult, AuthenticateUserResponse, Body, Envelope.

StackTrace - это:

   at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeParameterPart(XmlDictionaryReader reader, PartInfo part, Boolean isRequest)
   at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader, MessageVersion version, String action, MessageDescription messageDescription, Object[] parameters, Boolean isRequest)
   at System.ServiceModel.Dispatcher.OperationFormatter.DeserializeBodyContents(Message message, Object[] parameters, Boolean isRequest)
   at System.ServiceModel.Dispatcher.OperationFormatter.DeserializeReply(Message message, Object[] parameters)
   at System.ServiceModel.Dispatcher.ProxyOperationRuntime.AfterReply(ProxyRpc& rpc)
   at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
   at System.ServiceModel.Channels.ServiceChannel.EndCall(String action, Object[] outs, IAsyncResult result)
   at System.ServiceModel.ClientBase`1.ChannelBase`1.EndInvoke(String methodName, Object[] args, IAsyncResult result)
   at Anyboat.Admin.UserService.UserServiceClient.UserServiceClientChannel.EndAuthenticateUser(IAsyncResult result)
   at Anyboat.Admin.UserService.UserServiceClient.Anyboat.Admin.UserService.UserService.EndAuthenticateUser(IAsyncResult result)
   at Anyboat.Admin.UserService.UserServiceClient.OnEndAuthenticateUser(IAsyncResult result)
   at System.ServiceModel.ClientBase`1.OnAsyncCallCompleted(IAsyncResult result)

Я поставил точку останова в своем SilverlightFaultBehaviour в ответном сообщении, и это ответ Конверта, который я получил. Обратите внимание на возврат каретки, который находится между * "\ r \ n" *

"<s:Envelope xmlns:a=\"http://www.w3.org/2005/08/addressing\" xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\">\r\n  <s:Header>\r\n    <a:Action s:mustUnderstand=\"1\">urn:UserService/AuthenticateUserResponse</a:Action>\r\n    <a:RelatesTo>urn:uuid:07cc1361-c74c-4449-b423-e982d2ac8e05</a:RelatesTo>\r\n  </s:Header>\r\n  <s:Body>\r\n    <AuthenticateUserResponse>\r\n      <AuthenticateUserResult xmlns:d4p1=\"http://schemas.datacontract.org/2004/07/AnyBoat.Web.Classes.DataObjects\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">\r\n        <d4p1:Active>true</d4p1:Active>\r\n        <d4p1:EmailAddress>robbie@robbietapping.com.au</d4p1:EmailAddress>\r\n        <d4p1:FirstName>Robbie</d4p1:FirstName>\r\n        <d4p1:IsAdministrator i:nil=\"true\" />\r\n        <d4p1:LastName>Tapping</d4p1:LastName>\r\n        <d4p1:Password>xxxxxxxxx</d4p1:Password>\r\n        <d4p1:UserID>2</d4p1:UserID>\r\n        <d4p1:UserName>robbietapping</d4p1:UserName>\r\n      </AuthenticateUserResult>\r\n    </AuthenticateUserR
esponse>\r\n  </s:Body>\r\n</s:Envelope>"

Может кто-нибудь сказать мне, есть ли вообще что-то в стороне, я обновил VS2010 до SP1, где он начал себя показывать.

Любая информация или ответы будут с благодарностью.

Спасибо

EDIT

Код, по которому возникает ошибка:

 public Anyboat.Admin.UserService.User EndAuthenticateUser(System.IAsyncResult result) {
                object[] _args = new object[0];
                Anyboat.Admin.UserService.User _result = ((Anyboat.Admin.UserService.User)(base.EndInvoke("AuthenticateUser", _args, result)));
                return _result;
            }

1 Ответ

1 голос
/ 01 мая 2011

Какой тип сериализации вы используете на стороне услуг?Я вполне уверен, что вы используете некоторые пользовательские сериализации. "\ r \ n" проблема довольно распространена и возникает, когда вы пытаетесь десериализовать не правильно сформированный xml, полученный от службы.
Итак, я вижу два пути:

  1. Самый предпочтительный способ.Проверьте сериализатор на стороне обслуживания.Очевидно, что служба возвращает XML в неправильном формате.
  2. Добавьте IClientMessageInspector клиенту и удалите специальные символы из ответа перед десериализацией.
...