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
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
Comment