Announcement

Collapse
No announcement yet.

WCF Callback NetNamedPipeBinding

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

  • WCF Callback NetNamedPipeBinding

    Moin Zusammen,

    ich habe gerade ein Beispiel mit WCF-Callback. Es funktioniert soweit, nur mit NetNamedPipeBinding habe ich so meine Probleme.

    Mit HTTP oder NetTcp bekomme ich ein Callback zwischen Server und Client her. Aber mit NetPipe funktioniert es nicht so ganz.

    Meine Umgebung: Server: Windows 7 --- Client: VMWare-Player XP.
    Auf beiden ist die Firewall deaktiviert. Der Server ist als Administrator geöffnet. Der Client-User ist ein Localer-Administrator. Der Client läuft in der VM auf dem Server-Rechner. Ich benutze keinen Dienst.

    Der Server läuft und bringt auch keine Fehler (außer, wenn noch kein Client angemeldet ist). Ist aber noch nicht für mehrere Clientzugriffe programmiert. Fehlermeldung auf dem Server:
    16.07.2012 09:06:05 - Es war kein an net.pipe://192.168.5.133/Reverse lauschender Endpunkt vorhanden, der die Nachricht annehmen konnte. Dies wird häufig durch eine fehlerhafte Adresse oder SOAP-Aktion verursacht. Weitere Details finden Sie unter "InnerException", sofern vorhanden.


    Ich habe schon zwei Tage damit verbracht eine Lösung zu finden aber auch im Internet habe ich nichts schlüssiges gefunden. Vielleicht könnt Ihr mir ja weiterhelfen.

    Code auf dem Server:
    [highlight=csharp]
    using System;
    using System.ServiceModel;
    using System.Threading;
    namespace WCFServer
    {
    [ServiceContract(SessionMode = SessionMode.Required,CallbackContract = typeof(ICallbacks))]
    public interface IStringReverser
    {
    [OperationContract]
    void Register();
    }

    public interface ICallbacks
    {
    [OperationContract(IsOneWay = true)]
    void MyCallbackFunction(string callbackValue);
    }

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    public class StringReverser : IStringReverser
    {
    private ICallbacks callbacks;
    public static StringReverser StringRev;
    public StringReverser()
    {
    if (StringRev == null)
    {StringRev = this;}
    }

    public string ReverseString(string value)
    {
    char[] retVal = value.ToCharArray();
    try
    {
    for (int ii = 0; ii < 1; ii++)
    {
    int idx = 0;
    for (int i = value.Length - 1; i >= 0; i--)
    retVal[idx++] = value[i];
    callbacks.MyCallbackFunction(new string(retVal));
    Console.WriteLine("Anfrage vom Client erhalten. Text: " + value);
    if (value == "exit")
    {Console.WriteLine("Client hat sich verabschiedet!");}
    }
    }
    catch (Exception ex){Console.WriteLine(ex.Message);}

    return new string(retVal);
    }

    public void Register()
    {callbacks = OperationContext.Current.GetCallbackChannel<ICallb acks>();}
    }

    class Program
    {
    static void Main(string[] args)
    {
    using (
    ServiceHost host = new ServiceHost(typeof(StringReverser),
    new Uri[]{new Uri("net.pipe://alo-win7")}))
    {
    try
    {
    host.AddServiceEndpoint(typeof(IStringReverser),ne w NetNamedPipeBinding(NetNamedPipeSecurityMode.None) ,"Reverse");
    host.Open();
    Console.WriteLine("Service is available. " + "Press <ENTER> to exit.");
    int schleifenAnfang = 150;
    while (true)
    {
    for (int i = 0; i < schleifenAnfang; i++)
    {
    Thread.Sleep(5000);
    try
    {
    Console.WriteLine(StringReverser.StringRev.Reverse String("Test"));
    Console.WriteLine("Ich polle zum {0}. mal noch {1} über.", i, schleifenAnfang - i);
    }catch {Console.WriteLine("EEEEE");}
    }
    break;
    }
    host.Close();
    }
    catch (Exception ex){Console.WriteLine(ex.Message);}
    finally{Console.ReadLine();}
    }
    }
    }
    }
    [/highlight]
    Code auf dem Client
    [highlight=csharp]
    using System;
    using System.ServiceModel;
    using System.ServiceModel.Channels;
    using System.ServiceModel.Description;
    namespace WCFClient
    {
    [ServiceContract(SessionMode = SessionMode.Required,CallbackContract = typeof(ICallbacks))]
    public interface IStringReverser
    {
    [OperationContract]
    void Register();
    }

    public interface ICallbacks
    {
    [OperationContract(IsOneWay = true)]
    void MyCallbackFunction(string callbackValue);
    }

    public class Callbacks : ICallbacks
    {
    int anzahl = 1;
    public void MyCallbackFunction(string callbackValue)
    {
    Console.Write("Callback Received: {0}", callbackValue);
    Console.WriteLine(" - Zum {0}. mal", anzahl++);
    }
    }

    class Program
    {
    static void Main(string[] args)
    {
    try
    {
    var netPipe = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None) ;

    Callbacks myCallbacks = new Callbacks();
    DuplexChannelFactory<IStringReverser> pipeFactory =
    new DuplexChannelFactory<IStringReverser>(
    myCallbacks,netPipe,new EndpointAddress("net.pipe://server-win7/Reverse"));

    IStringReverser pipeProxy = pipeFactory.CreateChannel();
    pipeProxy.Register();
    while (true)
    {
    System.Threading.Thread.Sleep(100);
    //Listen to the Server
    }
    }
    catch(Exception ex)
    {
    Console.WriteLine(ex.Message);
    SchreibeInDatei.Fehler(ex.Message);
    }
    finally
    {
    Console.WriteLine("Zum beenden Enter drücken");
    Console.Read();
    }
    }
    }
    }
    [/highlight]

    Vielen Dank für Eure Unterstützung

    Gruß Lerando

  • #2
    Hallo,

    ich hab jetzt nicht alles gelesen, aber Named-Pipes funktioniert auf dem gleichen Rechner, also nicht über die Rechnergrenzen hinaus. Hier ist TCP od. HTTP zu verwenden.
    Für die Entscheidung siehe auch System-Provided Bindings, Choosing a Transport und WCF 4 Binding Decision Tree

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

    Comment


    • #3
      Vielleicht ist mein Englisch miserabel, aber ich denke es ist doch möglich? Oder lese ich die Aussage von Microsoft falsch
      When to Use the Named Pipe Transport

      A named pipe is an object in the Windows operating system kernel, such as a section of shared memory that processes can use for communication. A named pipe has a name, and can be used for one-way or duplex communication between processes on a single machine.

      When communication is required between different WCF applications on a single computer, and you want to prevent any communication from another machine, then use the named pipes transport. An additional restriction is that processes running from Windows Remote Desktop may be restricted to the same Windows Remote Desktop session unless they have elevated privileges.
      Gruß Lerando
      Zuletzt editiert von gfoidl; 16.07.2012, 12:58. Reason: Fullquote entfernt

      Comment


      • #4
        Hallo,

        da steht doch klar, dass NamedPipes nur auf einem Computer (single computer) funktioniert und oben in der Erklärung steht, dass eine NamedPipe ein Objekt vom Windows-Betriebssystem ist, wie ein geteilter Speicher.
        Dieser geteilte Speicher kann eben nicht auf mehrere Computer verteilt werden.

        Auch eine virtuelle Maschine auf dem gleichen realen Computer ist als eigenständiger Computer zu sehen.

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

        Comment


        • #5
          Vielen Dank für Deine Unterstützung.

          Wie immer hast Du mir sehr geholfen.

          Gruß Lerando

          Comment

          Working...
          X