Autor Beitrag
ebber
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 239
Erhaltene Danke: 1

Win XP, Win 7
C# (VS 2010), Delphi (2007), Expression 4
BeitragVerfasst: So 02.11.08 21:06 
Hallo,

mein Problem ist ein wenig kompliziert zu beschreiben. Ich kann es schlecht lösen da ich irgendwie nicht so genau verstehe wie was wo... Ich beschreibe es mal:

Ich habe hier einen Programm, dass als WCF Server fungiert. Das ganze wird so gestartet:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
            host = new ServiceHost(typeof(ebbService));

            NetTcpBinding tcpBinding = new NetTcpBinding(); 
            tcpBinding.TransactionFlow = false;
            tcpBinding.Security.Transport.ProtectionLevel = System.Net.Security.ProtectionLevel.EncryptAndSign;
            tcpBinding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
            tcpBinding.Security.Mode = SecurityMode.None; 

            host.AddServiceEndpoint(typeof(IebbService), tcpBinding, serviceUrl);
            
            host.Open();

Das oben ist in meinem normalen Window in einem Button Click Event.


Dann gibt es 2 auto generiete Dateien von VS (an die ich meine Sachen angefügt habe)
IebbServices.cs
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
namespace eBM
{
    // NOTE: If you change the interface name "IebbService" here, you must also update 
    //       the reference to "IebbService" in App.config.

    [ServiceContract]
    public interface IebbService
    {
        [OperationContract]
        string DoWork(string text);
    }

}


und ebbService.cs

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
namespace eBM
{
    // NOTE: If you change the class name "ebbService" here, you must also update the reference to 
    //       "ebbService" in App.config.

    public class ebbService : IebbService
    {
        public string DoWork(string text)
        {
            return "e ist " + text;
        }

    }
}


Also das funktioniert jetzt so, dass ich mit einem anderen Programm connecte und dann DoWork eben ausführe und dann das return bekomme. Ich möchte jetzt aber wenn DoWork ausgeführt wird eine Funktion in meinem Hauptfenster vom Anfang ausführen.
Ich habe aber leider keine Ahnung wie ich zu dem komme?
Ich hoffe die Informationen reichen sonst würde ich einfach mal das ganze Projekt anhängen wenns sich jemand anschauen würde.



MfG
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: So 02.11.08 23:10 
Ohne einen wirklichen Überblick über WCF zu haben: Es gibt doch eine Überladung des ServiceHost-Konstruktors, die kein Type sondern ein Objekt entgegennimmt. Der kannst du also eine Instanz deiner Service-Klasse andrehen, in die du eine Referenz auf deine Form gepackt hast (ein Event wäre natürlich schöner).

_________________
>λ=
ebber Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 239
Erhaltene Danke: 1

Win XP, Win 7
C# (VS 2010), Delphi (2007), Expression 4
BeitragVerfasst: So 02.11.08 23:46 
Also ich vermute mal du hast sowas gemeint:

ausblenden C#-Quelltext
1:
2:
3:
4:
            ebbService ebbS = new ebbService(this);

            //host = new ServiceHost(typeof(ebbService));
            host = new ServiceHost(ebbS);


Funktioniert leider nicht. Bringt Folgende Fehlermeldung(ich weis nicht ob jemand was damit Anfangen kann/will):
ausblenden Quelltext
1:
2:
exception of type 'System.InvalidOperationException' occurred in System.ServiceModel.dll
The communication object is not in a Opened or Opening state and cannot be modified.


Ein Event ginge nur wenn das Andere auch ginge?

MfG
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4799
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 03.11.08 12:42 
Du könntest ein statisches Event definieren (da du ja direkt kein Objekt der Klasse IebbService erzeugst) und dich dann daran hängen und dieses dann in DoWork aufrufen.
ebber Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 239
Erhaltene Danke: 1

Win XP, Win 7
C# (VS 2010), Delphi (2007), Expression 4
BeitragVerfasst: Mo 03.11.08 17:49 
Hört sich gut an :)
Ich habe aber leider keine Ahnung wie das auch nur ungefähr gehen könnte :(
Könntest du mir dazu ein paar Zeilen Code geben, bitte.

MfG
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 03.11.08 17:57 
user profile iconebber hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden C#-Quelltext
1:
2:
3:
4:
            ebbService ebbS = new ebbService(this);

            //host = new ServiceHost(typeof(ebbService));
            host = new ServiceHost(ebbS);
Vielleicht bin ich gerade irgendwie neben der Spur, aber ich sehe weder von deiner Service-Klasse noch von ServiceHost einen Konstruktor mit einem Parameter :gruebel: ?

_________________
>λ=
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4799
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 03.11.08 18:08 
Wie man ein Ereignis definiert und aufruft, sollte eigentlich in jedem Anfängerbuch stehen, u.a. auch hier openbook.galileocomp...ng.de/visual_csharp/ Kapitel 4.5.
Und "statisch" bedeutet, daß du einfach "static" dazu schreibst:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
public ebbService // Klassennamen solltest du besser mit einem Großbuchstaben anfangen lassen!
{
  public static event EventHandler DoWorkEvent; // <- Def. des statischen Events

  public string DoWork(string text)  
  {  
     if(DoWorkEvent != null)
       DoWorkEvent(this, EventArgs.Empty); // <- Aufruf

     return "e ist " + text;  
  }
}

// in deiner Form-Klasse
ebbService.DoWorkEvent += myDoWork;

void myDoWork(object sender, EventArgs e)
{
  // do what you want...
}
ebber Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 239
Erhaltene Danke: 1

Win XP, Win 7
C# (VS 2010), Delphi (2007), Expression 4
BeitragVerfasst: Mo 03.11.08 20:02 
@Kha: Vielleicht bin ich gerade neben der Spur, aber das this hier
ausblenden C#-Quelltext
1:
ebbService(this);					

ist der Parameter?
Und dann:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
        Window1 wind;

        public ebbService(Window1 win)
        {
            wind = win;
        }


@Th69

Danke, funktioniert einwandfrei.

MfG