Laden...

WCF WebService Server auf Client zugreifen.

Erstellt von Ayke vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.474 Views
Hinweis von MarsStein vor 13 Jahren

verschoben aus Webtechnologien

Ayke Themenstarter:in
643 Beiträge seit 2006
vor 13 Jahren
WCF WebService Server auf Client zugreifen.

Hallo,

ich habe grade begonnen mich mit WCF zu beschäftigen. Bin jetzt schon ein beispiel für einen WebService durchgegangen. Jetzt habe ich mal eine dumme Frage.
Kann ich vom Server auch auf Methoden vom Client zugreifen ?

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo Ayke,

Kann ich vom Server auch auf Methoden vom Client zugreifen ?

Ich bin zwar auch kein WCF Profi, aber ich bin mir ziemlich sicher dass das so nicht funktioniert.

Du kannst aber sehr wohl Events am Server feuern und am Client abonnieren.

Gruß
Michael

Ayke Themenstarter:in
643 Beiträge seit 2006
vor 13 Jahren

Das hört sich doch schon mal gut an. Jetzt muss ich nur noch herausfinden wie.

699 Beiträge seit 2007
vor 13 Jahren

Hallo Ayke,

ich hatte mal versuchsweise einen Mini Chat geschrieben mit WCF.
Dafür hab ich NetTcpBinding verwendet und das Observer Pattern implementiert.

Ob das Binding auch durch eine NAT Firewall kommunizieren kann, bezweifel ich im moment noch. Aber dafür gibt es auch Lösungen, wie man das umgehen kann, komme nur im moment nicht auf den Begriff.

Grüße
Stephan

Ayke Themenstarter:in
643 Beiträge seit 2006
vor 13 Jahren

Langsam habe ich genug von WCF. Es ist einfach nix zu finden. Ich will mir doch kein Buch holen müssen um sowas simples zu machen. Habe mir ein test-halber einfachen WebService erstellt. Funktioniert soweit.

Jetzt möchte ich den Client nur zur einen Aktion bewegen. z.B Jeder client soll "Hallo Welt" in der Console anzeigen. Kann doch nicht so schwer sein !
Es wäre für mich um einiges einfacher über einen Timer einen Endpoint auf einen bool zu checken. Da macht WCF wahrscheinlich nicht anderes. Versteh auch nicht das Konzept dahinter. Wozu brauche ich dann 2 Channels ? Kann mir jemand erklären wie, weshalb warum ? Bitte keine links habe auch google 😃 und es hat mir dieses mal nicht geholfen
Für Hilfe wäre sehr sehr dankbar.

Server


        static void Main(string[] args)
        {
            Uri baseAddress = new Uri("http://localhost:80/");
            WebServiceHost sh = new WebServiceHost(typeof(TestClass), baseAddress);
            sh.Open();
            Console.WriteLine("Running");
            Console.ReadLine();
        }

    public class TestClass : TestInterface
    {
        public string GetText()
        {
            return "string vom server";
        }
    }

Client

        static void Main(string[] args)
        {
            ChannelFactory<TestInterface> cf = new ChannelFactory<TestInterface>(new WebHttpBinding(), "http://localhost:80");
            cf.Endpoint.Behaviors.Add(new WebHttpBehavior());
            TestInterface channel = cf.CreateChannel();
            Console.WriteLine(channel.GetText());
            Console.Read();
        }

Interface

    [ServiceContract()]
    interface TestInterface
    {
        [OperationContract]
        [WebGet]
        string GetText();
    }
3.430 Beiträge seit 2007
vor 13 Jahren

Hallo Ayke,

bei deinen Contract kannst du auch ein CallbackContract angeben.

Guckst du hier:


  [ServiceContract(SessionMode = SessionMode.Allowed, CallbackContract =typeof(INetworkingCallback))]
  public interface INetworking
  {
    [OperationContract(IsOneWay = false)]
    [NetDataContractFormat]
    object TestMethod(string message);
  }

Und dann nocht der CallbackContract


  public interface INetworkingCallback
  {
    [OperationContract(IsOneWay = true)]
    [NetDataContractFormat]
    void Foo(string message);
  }

Als Binding habe ich das NetTcpBinding verwendet.
Am Server musst du dann nur Foo aufrufen um den Callback-Mechanismus auszulösen.

Beim Client kannst du dir dann die Klassen generieren lassen.
Dann bekommst du ein Foo-Event welches durch den Callback-Mechanismus gefeuert wird

So kannst du es dann abonnieren


var endpointAddress = new EndpointAddress(_connectionUri);
var serviceBinding = new NetTcpBinding(SecurityMode.None, false);
var networkingClientCallback = new NetworkingClientCallback();
networkingClientCallback.Foo += (obj, e) =>	 {
				//Event FIRED
			 };
_networkingClient = new NetworkingClient(new InstanceContext(networkingClientCallback), serviceBinding, endpointAddress);
_networkingClient.Open();

Hinweis: Ich bin kein WCF Experte und kann dir auch nicht sagen ob das der perfekte Stil ist.
Aber ich habe es so oder so ähnlich in einem kleinen Projekt mal umgesetzt und es läuft problemlos.

Gruß
Michael

Ayke Themenstarter:in
643 Beiträge seit 2006
vor 13 Jahren

super danke michlG !