2014-02-24 4 views
0

Создал новый клиент веб-сервиса для web-сервиса axis2 в моем приложении .net. Вызов некоторых методов веб-сервиса. .Net вызывает webservice и читает xml-ответ, но не может десериализовать его. Сгенерированный прокси-код, как правило, для .net, его нормально. wsdl передается соответствие wsi.Consume Axis2 webservice from .net

С wirehark я видел ответ xml очень нормальный. веб-служба является ответом на запрос, но XML-данные кажутся ошибочными. позвольте мне показать те же данные и контракты.

XML-ответ:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
    <ns:blablaResponse xmlns:ns="http://blabla"> 
     <ns:return type="blablaMessage" xmlns:ax274="http://blabla/xsd" xmlns:ax272="http://blabla/xsd" xmlns:ax271="http://blabla/xsd"> 
     <ax274:blablaNo>1</ax274:blablaNo> 
     <ax274:blablaNo>2</ax274:blablaNo> 
     <ax274:blablaNo>3</ax274:blablaNo> 
     <ax274:blablaDescription>TEXT 1</ax274:blablaDescription> 
     <ax274:blablaDescription>TEXT 2</ax274:blablaDescription> 
     <ax274:blablaDescription>TEXT 3</ax274:blablaDescription> 
     <ax274:statustype="blblaState"> 
      <ax272:textMessage/> 
      <ax272:code>OK</ax272:code> 
     </ax274:status> 
     </ns:return> 
    </ns:blablaResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

автогенерируемая контракта данных:

<System.Diagnostics.DebuggerStepThroughAttribute(), _ 
System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0"), _ 
System.Runtime.Serialization.DataContractAttribute(Name:="blablaResponse", [Namespace]:="http://blabla"), _ 
System.SerializableAttribute()> _ 
Partial Public Class blablaMessage 
    Inherits Object 
    Implements System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged 

    <System.NonSerializedAttribute()> _ 
    Private extensionDataField As System.Runtime.Serialization.ExtensionDataObject 

    Private blablaNoField As ServiceReference1.ArrayOf_xsd_int 

    Private blablaDesriptionField As ServiceReference1.ArrayOf_xsd_string 

    Private statusField As ServiceReference1.status 

    <Global.System.ComponentModel.BrowsableAttribute(False)> _ 
    Public Property ExtensionData() As System.Runtime.Serialization.ExtensionDataObject Implements System.Runtime.Serialization.IExtensibleDataObject.ExtensionData 
     Get 
      Return Me.extensionDataField 
     End Get 
     Set(value As System.Runtime.Serialization.ExtensionDataObject) 
      Me.extensionDataField = value 
     End Set 
    End Property 

    <System.Runtime.Serialization.DataMemberAttribute(IsRequired:=True)> _ 
    Public Property blablaNo() As ServiceReference1.ArrayOf_xsd_int 
     Get 
      Return Me.blablaNoField 
     End Get 
     Set(value As ServiceReference1.ArrayOf_xsd_int) 
      If (Object.ReferenceEquals(Me.blablaNoField, value) <> True) Then 
       Me.blablaNoField = value 
       Me.RaisePropertyChanged("blablaNo") 
      End If 
     End Set 
    End Property 

    <System.Runtime.Serialization.DataMemberAttribute(IsRequired:=True)> _ 
    Public Property blablaDescription() As ServiceReference1.ArrayOf_xsd_string 
     Get 
      Return Me.blablaDesriptionField 
     End Get 
     Set(value As ServiceReference1.ArrayOf_xsd_string) 
      If (Object.ReferenceEquals(Me.blablaDesriptionField, value) <> True) Then 
       Me.blablaDesriptionField = value 
       Me.RaisePropertyChanged("blablaDescription") 
      End If 
     End Set 
    End Property 

    <System.Runtime.Serialization.DataMemberAttribute(IsRequired:=True)> _ 
    Public Property status() As ServiceReference1.IslemSonucu 
     Get 
      Return Me.statusField 
     End Get 
     Set(value As ServiceReference1.IslemSonucu) 
      If (Object.ReferenceEquals(Me.statusField, value) <> True) Then 
       Me.statusField = value 
       Me.RaisePropertyChanged("status") 
      End If 
     End Set 
    End Property 

    Public Event PropertyChanged As System.ComponentModel.PropertyChangedEventHandler Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged 

    Protected Sub RaisePropertyChanged(ByVal propertyName As String) 
     Dim propertyChanged As System.ComponentModel.PropertyChangedEventHandler = Me.PropertyChangedEvent 
     If (Not (propertyChanged) Is Nothing) Then 
      propertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs(propertyName)) 
     End If 
    End Sub 
End Class 

Пробовал wsdl.exe svcutil.exe с некоторыми различными параметрами, вот и все не удалось. Кажется, проблема с сериализацией с осью 2, потому что разные типы элементов в одном и том же родителе xml. Например, blablaNo и blablaDescription.

Как я могу решить эту проблему. Благодарю.

ответ

0

Издатель отправлен в новый файл wsdl и проблема решена.

0

В соответствии с ответом на XML, показывающим, что это странно, blablaNo для меня не является массивом int, но я читаю его как 3 переменные int, и они, похоже, не имеют различимых имен. Никогда не видел, чтобы XML формировался таким образом, но я никогда не работал с выходом Java-сервиса перед тем.

Знаете, если бы я был вами, я бы попытался изменить вывод службы Axis на JSON. Сначала это будет меньше, а во-вторых, это полностью устранит путаницу в форматировании вывода. де-сериализовать JSON в .net очень просто.

Вот очень простой пример, я в настоящее время работает над (услуга связи 3 Дифференц друг с другом и PHP-страницы и .Net настольное приложение)

internal class CFingerPrint 
{ 
    public string WanIP; 
    public string MacAddress;  

    public string getClassEncrypted() 
    { 
     return new JavaScriptSerializer().Serialize(this); 
    } 

    public CFingerPrint getClassDecrypted(string sSerializedClass) 
    { 
     return new JavaScriptSerializer().Deserialize<CFingerPrint>(sSerializedClass); 
    } 
} 

В JSON вам не нужны фантазии атрибуты везде основные свойства. Если вы не вернете пользовательский объект, вы должны быть в порядке.

+0

Поставщик услуг никогда не меняет свой собственный сервисный уровень, код и т. Д. Blabla - это моя строка замены. Спасибо –

+0

Тогда я думаю, вам нужно будет создать собственный десериализатор XML. Просто загрузите как обычные узлы, как вы собираетесь заполнить древовидную структуру, а затем просто вырезать ствол до тех пор, пока сообщения не останутся единственными оставленными – Franck

+0

это плохо для меня, слишком много операций и контрактов, найденных в сервисе. спасибо –

Смежные вопросы