Announcement

Collapse
No announcement yet.

Webservice: Exceptions und Basisklassen

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

  • Webservice: Exceptions und Basisklassen

    [edit=gfoidl] Thema umbenannt. Ursprünglich: Fragen zu Webservices [/edit]

    Hallo allerseits,

    ich habe ein paar Fragen zu Webservices.

    Gehen wir davon aus, ich habe folgende Umgebung:

    [highlight=c#]using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ServiceModel;

    namespace MyService
    {
    [ServiceContract]
    public interface ICustomService
    {
    [OperationContract]
    CustomType[] getCustomType();
    }
    }

    namespace MyService
    {
    public class CustomService : ICustomService
    {
    private CustomType[] ct;

    public CustomType[] getCustomType(){
    if (ct.Length>100)
    throw new Excaption("100 überschritten");
    else
    return ct;
    }
    }[/highlight]
    [highlight=c#]namespace MyHost
    {
    class Program
    {
    static void Main(string[] args)
    {
    Console.WriteLine("***** MyService Based WCF Host *****");

    using (ServiceHost serviceHost = new
    ServiceHost(typeof(CustomService)))
    {
    serviceHost.Open();

    Console.WriteLine("The service is read.");
    Console.WriteLine("Press the Enter key to terminate
    Service.");
    Console.ReadLine();
    }
    }
    }
    }[/highlight]
    [highlight=xml]<!--Host App.config-->
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    <system.serviceModel>
    <services>
    <service name="MyService.CustomService"
    behaviorConfiguration="MyServiceMEXBehavior" >
    <endpoint address=""
    binding="basicHttpBinding"
    contract="MyService.ICustomService"/>

    <!--Enable the MEX endpoint-->
    <endpoint address="mex"
    binding="mexHttpBinding"
    contract="IMetadataExchange" />

    <!--Need to add this so MEX knows the adress of our service-->
    <host>
    <baseAddresses>
    <add baseAddress="http://localhost:8080/MyService"/>
    </baseAddresses>
    </host>
    </service>
    </services>
    <!--A behavior definition for MEX-->
    <behaviors>
    <serviceBehaviors>
    <behavior name="MyServiceMEXBehavior">
    <serviceMetadata httpGetEnabled="true"/>
    </behavior>
    </serviceBehaviors>
    </behaviors>
    </system.serviceModel>
    </configuration>[/highlight]
    [highlight=c#]namespace myType
    {
    public class CustomType
    {
    public int x { get; private set; }

    public CustomType(int X)
    {
    CustomType.x=X;
    }
    }
    }[/highlight]

    [highlight=c#]// und einem einfachen Client der nur eine ServiceReference auf den Host hat und dem der CustomType bekannt ist.
    Ansonsten ist dort aber nichts verändert.[/highlight]

    Frage 1:
    Was muss ich hier ändern, um meinen CustomType über den Webservice an einen Client übertragen zu können?

    Frage 2:
    Was muss ich machen, um die Excaption in getCustomType an den Client
    weiterleiten zu können?

    evtl. kommen noch Fragen dazu
    Aber könnt ihr mir vorerst dabei helfen?

    MfG,
    Tobias
    Zuletzt editiert von Athlone; 26.10.2009, 15:04.

  • #2
    Hallo,

    ad 1) Schau mal nach DataContract

    ad 2) da ich es nicht besser könnte als hier beschrieben verweise ich auf den Link


    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Hallo gfoidl,

      danke dir für die schnelle Antwort!

      Originally posted by gfoidl
      ad 2) da ich es nicht besser könnte als hier beschrieben verweise ich auf den Link
      Super Tip! Dass ich den über google nicht gefunden habe... ^^ hat funktioniert.
      Allerdings musste ich wie hier beschrieben auch die Option unter Extras->Optionen->Debugging->Allgemein->"Nur eigenen Code aktivieren (nur verwalten)" deaktivieren, da der Host sonst jedes Mal rausgeflogen ist.


      Originally posted by gfoidl
      ad 1) Schau mal nach DataContract
      Das werde ich morgen mal genauer unter die Lupe nehmen. Jetzt wird erst mal geschlafen

      Gruß,
      Athlone

      Comment


      • #4
        Hallo Athlone,

        danke für die Anmerkung mit dem Debugger - hab ich nicht gewusst


        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Hallo,
          ich nochmal.

          Also im kleinen Beispiel funktioniert jetzt alles.
          Allerdings in meinem eigentlichen Programm nicht

          Problem ist da, dass mein "CustomType" wesentlich komplexer ist. Dabei handelt es sich um eine Klasse, die Variablen anderer eigener Typen beinhaltet. Unter anderem referenziert eine Variable eine abstrakte Klasse, von der drei andere Klassen abgeleitet werden.
          Genau wegen dieser Variablen bekomme ich folgende Fehlermeldung auf dem Client, wenn mein "CustomType" von der Webservice-Methode zurück gegeben wird:
          Originally posted by Fehlermeldung
          "Fehler beim Empfangen der HTTP-Antwort für http://localhost:8080/MyService. Die Ursache kann sein, dass die Dienstendpunktbindung kein HTTP-Protokoll verwendet. Eine andere mögliche Ursache ist, dass der HTTP-Anforderungskontext vom Server abgebrochen wird (vermutlich auf das Herunterfahren des Diensts zurückzuführen). Weitere Informationen finden Sie in den Serverprotokollen."
          Der Host hingegen läuft normal durch und wartet auf den nächsten Methodenaufruf.
          Lasse ich die abstrakte Klasse raus, bzw. schränke das Ganze auf eine der abgeleiteten Klassen ein, geht es.

          Gibt es eine Möglichkeit eine abstrakte Klasse über einen Webservice als DataContract zu nutzen?

          MfG,
          Athlone

          Comment


          • #6
            Hallo,

            Gibt es eine Möglichkeit eine abstrakte Klasse über einen Webservice als DataContract zu nutzen?
            Nein gibt es nicht. Dieses Thema hatten wir schon mal, daher schau dir bitte vorher http://entwickler-forum.de/showthread.php?t=57596&highlight=wcf+basisklasse an.

            Es gibt eine Möglichkeit mit einem anderen Formatierer, aber mit dem hats bei mir nie geklappt und ich weiß momentan auch nicht mehr wie der heißt.


            mfG Gü
            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

            Comment


            • #7
              Hi Gü,

              ich hab mich in dem anderen Thread belesen und wusste auch noch, dass es soetwas wie "KnownType" gibt.
              Bei mir funktioniert es damit. Ich habe bei meiner abstrakten Klassen die drei abgeleiteten Klassen mit "KnownType" bekannt gemacht, sämtliche Klassen dieser dll als DataContract markiert und die dll als Verweis im Client importiert. Dadurch hat Visual Studio mir einen neuen Ordner namens "DataSources" unter "Properties" angelegt und dort einen Verweis auf den Rückgabetyp meiner Webservice-Methode hinterlegt welcher auch eine Variable vom abstrakten Typ enthält.
              Nun wird der Referenzierte Typ 1:1 in den realen Typ abgebildet. Und ich kann auf dem Client schön sauber arbeiten. (auch mit dem abstrakten Typ)

              Ich weiß zwar nicht, ob das vielleicht gegen die Idee eines Webservice geht, dass die verwendeten Typen auch auf dem Client bekannt sind, aber für mich ist das momentan die einfachste Lösung. (Hinweise und Kommentare gerne gesehn )

              Mit freundlichen Grüßen,
              Athlone
              Zuletzt editiert von gfoidl; 26.10.2009, 12:37. Reason: Fullquote entfernt.

              Comment


              • #8
                Hallo Athlone,

                wenn ich mich an den anderen Beitrag erinnere so ging es dort um Schnittstellen und bei dir um (abstrakte) Basisklassen. Daher kann es durchaus sein (und würde auch Sinn machen) dass es funktioniert wie du beschrieben hast - das hab ich vergessen. Mit Schnittstellen gehts es aber nicht.

                Danke für die Rückmeldung und ergänzenden Hinweise.


                mfG Gü
                "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                Comment

                Working...
                X