Announcement

Collapse
No announcement yet.

ComplexType aus eigenem XML-Schema als Parameter oder Rückgabewert

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • ComplexType aus eigenem XML-Schema als Parameter oder Rückgabewert

    Hallo,

    in einer Arbeitsgruppe haben wir komplexe Typen (z.B. einen Transportauftrag-Typen) definiert und ein XML-Schema erstellt, welches alle Typen beinhaltet.

    Ich möchte nun einen Web-Service schreiben, der Typen daraus für Parameter oder für den Rückgabewert verwendet. Das könnte ich natürlich tun, indem ich den Parametern den Typ string gebe. Aber da Web Services ja auf SOAP basieren und dieses wiederum auf XML, und im automatisch generierten WSDL ja auch XML-Schema-Definitionen vorkommen, vermute ich, dass es eine wesentlich elegantere Möglichkeit gibt.

    Weiss jemand, wie man hier vorgeht oder hat einen Artikel zur Hand?

    Viele Grüsse
    Stefan

  • #2
    Hallo,

    angenommen, eine Methode des Web Services soll je nach Aufrufparameter eine der folgenden abgeleiteten Klassen zurückliefern:
    <pre>
    Public MustInherit Class OSComplexData
    Public UserName As String
    Public UserKey As Integer
    End Class
    <br>
    Public Class OSWinUser
    Inherits OSComplexData
    Public LogonTime As Date
    End Class
    <br>
    Public Class OSWebUser
    Inherits OSComplexData
    Public HomePage As String
    End Class
    </pre>
    Der Web Service liefert eine Instanz der Basisklasse zurück, wobei allerdings nur eine der beiden Nachfolgerklassen in Frage kommt. Damit die WSDL-Beschreibung dieses Web Services aber alle notwendigen Informationen enthält, muss diese Web Service-Methode auch die Daten der beiden Nachfolger von <i>OSComplexData</i> in ihrer WSDL-Beschreibung veröffentlichen. Dazu dienen die SoapRpcMethod- und <b>SoapInclude</b>-Attribute:
    <pre><font color="#0000ff" size="2">Imports</font></font><font size="2"> System.Web.Services
    </font><font color="#0000ff" size="2">Imports</font><font size="2"> System.Web.Services.Protocols
    </font><font color="#0000ff" size="2">Imports</font><font size="2"> System.Xml.Serialization
    <br>
    ...
    <br>
    &lt;WebService(Description:=&quot;Web Service liefert komplexe Daten zurück&quot;, Namespace:=&quot;http://OSSISOFT.local/&quot&gt; _
    <font color="#0000ff">Public Class</font> ServiceComplexData
    <font color="#0000ff">&nbsp; Inherits</font> System.Web.Services.WebService
    <br>
    ...
    <br>
    <br>&lt;WebMethod(Description:=&quot;Liefert entweder OSWinUser oder OSWebUser als Nachfahre von OSComplexData zurück&quot, _
    &nbsp; <b><font color="#ff0000">SoapRpcMethod</font></b>(), <font color="#ff0000"><b>SoapInclude</b></font>(<font color="#0000ff" size="2">GetType</font>(OSWinUser)), <font color="#ff0000"><b>SoapInclude</b></font>(<font color="#0000ff" size="2">GetType</font>(<b><font color="#ff00ff">OSWe</font></b>bU<b><font color="#ff00ff">ser</font></b>))&gt; _
    <font color="#0000ff" size="2">Public</font> <font color="#0000ff" size="2">Function</font> GetInstance(<font color="#0000ff" size="2">ByVal</font> iValue <font color="#0000ff" size="2">As</font> <font color="#0000ff" size="2">Integer</font>) <font color="#0000ff" size="2">As</font> OSComplexData
    &nbsp; <font color="#0000ff" size="2">Select</font> <font color="#0000ff" size="2">Case</font> iValue
    &nbsp;&nbsp;&nbsp; <font color="#0000ff" size="2">Case</font> 1
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000ff" size="2">Dim</font> aNewObj <font color="#0000ff" size="2">As</font> <font color="#0000ff" size="2">New</font> OSWinUser()
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aNewObj.LogonTime = <font color="#0000ff" size="2">Date</font>.Now()
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000ff" size="2">Return</font> aNewObj
    &nbsp;&nbsp;&nbsp; <font color="#0000ff" size="2">Case</font> 2
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000ff" size="2">Dim</font> aNewObj <font color="#0000ff" size="2">As</font> <font color="#0000ff" size="2">New</font> OSWebUser()
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aNewObj.UserName = <font color="#0000ff" size="2">Me</font>.User.Identity.Name
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aNewObj.UserKey = 4711
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aNewObj.HomePage = &quot;http://www.entwickler.com&quot;
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000ff" size="2">Return</font> aNewObj
    &nbsp; <font color="#0000ff" size="2">End</font> <font color="#0000ff" size="2">Select
    End</font> <font color="#0000ff" size="2">Function</pre>

    Der Client kann dann direkt das Ergebnis in die "richtige" Klasse eintauschen:
    <pre>
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim aWSObj As New localhost.ServiceComplexData()
    Dim aWSWebCls As localhost.OSWebUser
    aWSObj.Timeout = 5000
    aWSWebCls = aWSObj.GetInstance(2)
    ListBox1.Items.Add("HomePage = " + aWSWebCls.HomePage)
    ListBox1.Items.Add("UserName = " + aWSWebCls.UserName)
    ListBox1.Items.Add("UserKey = " + aWSWebCls.UserKey.ToString())
    StatusBar1.Text = "Web Service erfolgreich aufgerufen"
    End Sub
    &#10

    Comment


    • #3
      Hallo Herr Kosch,

      ich möchte nicht undankbar erscheinen für Ihre Antwort - aber sie passt leider überhaupt nicht zu meiner Frage :-(

      Viele Grüsse
      Stefan Schultz

      Comment

      Working...
      X