[C#] Webservice richtig aufrufen.

Blackhawk50000

Erfahrenes Mitglied
Hallo, ich habe ein Programm welches 3 Projekte enthalten soll.
Die GUI, eine BusinessLogic und einen DataLayer.

Im DataLayer soll der Webservice eingebunden sein mit dem es zu entwickeln gilt.

nehmen wir an, ich habe in der GUI eine textbox und will dort einen Text aus einem Webserviceaufruf einschreiben.

Wie mache ich das korrekt?

Wir würden die einzelnen Aufrufe aussehen? Denn momentan bekomme ich den webserviceaufruf hin, und meine Daten landen auch ´wieder im Datalayer. Da das ganze aber Asyncron abläuft habe ich keine Ahnung wie ich die empfangenen Daten zur GUI bekomme um dort meine Textbox zu füllen.

Es wäre wirklich lieb wenn ihr mir hier schnell helfen könntent.
 

Nico Graichen

Erfahrenes Mitglied
Hi

Dann mach deine Aufrufe von oben nach unten am besten durchgehend asynchron.
Das hat den Vorteil, dass deine Anwendung immer bedienbar ist.
 

Blackhawk50000

Erfahrenes Mitglied
genau so wollte ichs ja machen, die GUI ruft eine Methode in der BusinessLogik auf und die wiederum den Webserviceaufruf im DaytaLayer.

nehmen wir mal an wir haben die GUI

Code:
Using ......
Using.......
Using Business.Logic

NameSpace ......
{
      Class .....
      {
                  testboxtext.Text = ************************
      }
}


dann habe ich noch meine Business Logic

Code:
Using ......
Using.......
Using Data.Layer

NameSpace ......
{
public class BusinessLogic
    {
        public BusinessLogic()
        {

        }

        DataLayer.DataLayer _dataAccess = new DataLayer.DataLayer();

        public void LadeTestDaten(int id)
        {
            _dataAccess.GetPromoImage(id);
        }
    }
}


und ich habe meine DataLayer der bei mir MOMENTAN so aussieht

Code:
using CVPnet.DataLayer.WebService;

namespace CVPnet.DataLayer
{
    public class DataLayer
    {
        public DataLayer()
        {
            
        }

        CVPiServiceSoapClient _wrapper = new CVPiServiceSoapClient();

        public void GetPromoImage(int ID)
        {
            _wrapper.LadeWerbeBildCompleted += new EventHandler<LadeWerbeBildCompletedEventArgs>(GetPromoImageTeil02);
            _wrapper.LadeWerbeBildAsync(1);
        }

        private void GetPromoImageTeil02 (object sender, LadeWerbeBildCompletedEventArgs e)
        {
            object test = e.Result;
        }
}


Wie würde das ganze aussehen damit meine Textbox die Daten erhällt... ODER meines wegen ne ImageBox oder was auch immer?
 

Blackhawk50000

Erfahrenes Mitglied
Nur noch mal so eine frage, wie würde das ganze denn aussehen, wenn ich im DataLayer ein Event erstelle und dass bei ankunft der Daten auslöse.
Dann könnte ich von meiner BusinessLogic auf dieses Event hören und mir die Daten vom Datalayer holen, dann wären sie schon mal in der BusinessLogic, wie sehe das denn aus? könntest du diese 3 oder 4 Codezeilen bitte mal eben durchgeben?


momentan sieht mein datalayer so aus

Code:
using CVPnet.DataLayer.WebService;

namespace CVPnet.DataLayer
{
    public class DataLayer
    {
        public DataLayer()
        {
            
        }

        CVPiServiceSoapClient _wrapper = new CVPiServiceSoapClient();

        public event EventHandler<object> WerbeBildResult;

        public void GetPromoImage(int ID)
        {
            _wrapper.LadeWerbeBildCompleted += new EventHandler<LadeWerbeBildCompletedEventArgs>(GetPromoImageTeil02);
            _wrapper.LadeWerbeBildAsync(1);
        }

        private void GetPromoImageTeil02 (object sender, LadeWerbeBildCompletedEventArgs e)
        {
            WerbeBildResult(this, e.Result);
            object test = e.Result;
        }
}
 
Zuletzt bearbeitet:

Alexander Schuc

crazy-weasel
Hoi.. :)

Nur noch mal so eine frage, wie würde das ganze denn aussehen, wenn ich im DataLayer ein Event erstelle und dass bei ankunft der Daten auslöse.
Dann könnte ich von meiner BusinessLogic auf dieses Event hören und mir die Daten vom Datalayer holen, dann wären sie schon mal in der BusinessLogic, wie sehe das denn aus? könntest du diese 3 oder 4 Codezeilen bitte mal eben durchgeben?


Najo, wie solls dann großartig aussehen?

Z.B. so: (oder was genau war noch unklar? :))

C#:
public FakeDataEventArgs : EventArgs
{
  // ..
  public FakeDataObject Image { get; set; }
}

public FakeErrorEventArgs : EventArgs
{
  // ..
  public FakeErrorData Data { get; set; }
}

public FakeDataEventHandler : EventHandler<FakeDataEventArgs>
{
}
public FakeErrorEventHandler : EventHandler<FakeErrorEventArgs>
{
}

public class FakeDataProducer
{
	protected FakeSoapClient client = new FakeSoapClient();
	
	public event FakeErrorEventHandler Error;
	public event FakeDataEventHandler DataAvailable;
	
	protected void OnError(FakeErrorData data)
	{
		var handler = Error;
		var args = new FakeErrorEventArgs(data);
		
		if (handler != null)
			handler(this, args);
	}
	
	protected void OnDataAvailable(FakeDataObject obj)
	{
		var handler = DataAvailable;
		var args = new FakeDataEventArgs(obj)
		
		if (handler != null)
			handler(this, args);
	}
	
	public FakeDataProducer()
	{
		client.LoadCompleted += LoadCompletedHandler;
	}
	
	public void GetDataAsync(..)
	{
		client.LoadAsync(..);
	}
	
	protected void LoadCompletedHandler(object sender, LoadCompletedEventArgs ea)
	{
		if (ea.Error != null)
			OnDataAvailable( .. );
		else
			OnError( .. );
	}
}


public class FakeDataConsumer
{
	private FakeDataProducer producer;
	
	public FakeDataConsumer()
	{
		this.producer = = new FakeDataProducer();
		this.producer.Error += ProducerError;
		this.producer.DataAvailable += ProducerDataAvailable;
		
	}
	
	public void RequestData()
	{
		this.producer.GetDataAsync();
	}
	
	private void ProducerError(object sender, FakeErrorEventArgs ea)
	{
		// MessageBox.Show("oh noes");
	}
	
	private void ProducerDataAvailable(object sender, FakeDataEventArgs ea)
	{
		// MessageBox.Show("oh yes");
	}
}


lg,..
 

Nico Graichen

Erfahrenes Mitglied
Würde auch gehen, hat aber nichts mit asynchronen Methodenaufrufen zu tun. Der Client hat vor allem ein Problem, wenn er dein Event nicht abonniert.

Bei der Übergabe einer Zielmethode kannst du sicher sein, dass diese auch aufgerufen wird
 

Blackhawk50000

Erfahrenes Mitglied
wie kann es denn passieren, dass der client mein event nicht abonniert? Wenn ich dem das so sage, dann wird der das doch auch so machen, oder etwa nicht.

Die sache mit den Events habe ich hinbekommen. Aber für die Sache mit dem Callback (was ich nun so lange verstehe, fehlen mir irgendwie die Basics was das angeht.

Ich verstehe, dass ich in meiner BusinessLogic einen delegate deklarieren muss und dass ich den anschließend instanziieren muss und ihm gleichzeitig den namen meiner aufzugufenden Methode übergeben muss.

Was mir aber leider noch nicht in den kopf will (und da fehlt mir auch leider ein wenig die Zeit) ist, wie ich das mache, wenn meine aufzurufende Methode im DataLayer ja ein Event auslösßt wenn die Daten angekommen sind, und das Event bzw. der Handler dann das Result des Webaufrufes hat. Siehe Post Nr. 3 und 5.

Ich würds wirklich gerne so machen, wie es sich für Asyncone Methodenaufrufe gehört, aber ich blicks nicht....

mit dem was ich verstanden habe sehen meine beiden klassen nun so aus:

C#:
    public class BusinessLogic
    {
        public BusinessLogic()
        {

        }

        public delegate void Testdel(int id);
        private Testdel del;


        DataLayer.DataLayer _dataAccess = new DataLayer.DataLayer();

        public void LadeTestDaten(int id)
        {

            del = new Testdel(_dataAccess.GetPromoImage);
            AsyncCallback callback = new AsyncCallback(testmethod);

            del.BeginInvoke(1, callback, null);

           (_dataAccess_WerbeBildResult);            
        }

        object _dataAccess_WerbeBildResult(object sender, LadeWerbeBildCompletedEventArgs args)
        {
            return args.Result;
        }

        private void testmethod(IAsyncResult ar)
        {
            object test = ar;
        }
    }


und der DataLayer

C#:
    public class DataLayer
    {
        public DataLayer()
        {
            
        }

        CVPiServiceSoapClient _wrapper = new CVPiServiceSoapClient();    

        public delegate object WerbeBildResultEvent(object sender, LadeWerbeBildCompletedEventArgs args);
        public event WerbeBildResultEvent WerbeBildResult;

        public void GetPromoImage(int ID)
        {




            _wrapper.LadeWerbeBildCompleted += new EventHandler<LadeWerbeBildCompletedEventArgs>(GetPromoImageTeil02);
            _wrapper.LadeWerbeBildAsync(1);
        }

        private void GetPromoImageTeil02 (object sender, LadeWerbeBildCompletedEventArgs e)
        {
            WerbeBildResult(this, e);
            object test = e.Result;
        }

        public void GetZahler()
        {
            _wrapper.RS_GetZahlerdatenCompleted += new EventHandler<RS_GetZahlerdatenCompletedEventArgs>(GetZahlerTeil02);
            _wrapper.RS_GetZahlerdatenAsync(Application.Current.Host.InitParams["SessionId"].ToString());
        }

        private void GetZahlerTeil02(object sender, RS_GetZahlerdatenCompletedEventArgs e)
        {
            object test = e.Result;
        }
    }


wie bekomme ich nun die daten zurück zur BusinessLogic?
 
Zuletzt bearbeitet:

Neue Beiträge