2016-05-07 9 views
1

Umwelt: .net 4.6.1 auf 10 Windows x64WCF-Service Host empfängt Null-Objekt

Problem: 1. WCF Vertrag mit einem Ereignisse implementiert. 2. Der Service-Host löst das Ereignis jedes Mal aus, wenn ein Ereignisprotokolleintrag protokolliert und vom Client aufgerufen wird. 3. Die Host-Anwendung wird ordnungsgemäß ausgelöst, das Objekt (EventLogEntry) wird jedoch nicht ordnungsgemäß bereitgestellt und ist immer null. 4. Ich habe beim Debuggen überprüft, dass die Winforms-Anwendung auf der Clientseite ein instanziiertes Objekt übergibt. Dies bringt es irgendwie nicht auf die Server-Seite . 5. In diesem Stadium befinden sich sowohl der Client als auch der Server auf demselben Computer.

Frage: Warum ist das Objekt null und wie kann ich das beheben?

WCF-Servicecode:

[ServiceContract] 
public interface IloggerWCFServiceContract 
{ 

    [OperationContract(IsOneWay = true)] 
    void WriteEvent(EntryWrittenEventArgs e); 

    [OperationContract(IsOneWay = true)] 
    [ServiceKnownType(typeof(EventLogEntry))] 
    void OnEventWritten(EntryWrittenEventArgs e); 
} 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
public class wcf_logger_servicebase : IloggerWCFServiceContract 
{ 
    public event EventHandler<EntryWrittenEventArgs> eventwritten; 
    public void OnEventWritten(EntryWrittenEventArgs e) 
    { 
     if (eventwritten != null) 
      this.eventwritten(this, e); 
    } 

    public void WriteEvent(EntryWrittenEventArgs e) 
    { 
     OnEventWritten(new EntryWrittenEventArgs(e.Entry)); 

    } 

} 

Wcf WinForms Server Code:

wcf_logger_servicebase loggerWCFService = new wcf_logger_servicebase(); 
ServiceHost loggerServiceHost = new ServiceHost(loggerWCFService, new Uri(loggerGlobalStatics.namedPipeServerAddress)); 

loggerWCFService.eventwritten += new EventHandler<EntryWrittenEventArgs>(eventhandler_entryWritten); 
.....  
       loggerServiceHost.AddServiceEndpoint(typeof(IloggerWCFServiceContract), new NetNamedPipeBinding(), loggerGlobalStatics.namedPipeServerAddress); 
       loggerServiceHost.Open(); 
...... 
private void eventhandler_entryWritten(object sender, EntryWrittenEventArgs e) 
{ 
--->textBox1.Text += e.Entry.ToString() + "\r\n" ; 
} 

WCF WinForms Client-Code:

ChannelFactory<IloggerWCFServiceChannel> loggerChannelFactory; 
IloggerWCFServiceChannel loggerServiceChannel = null; 
wcf_logger_servicebase loggerWCFService = new wcf_logger_servicebase(); 
EndpointAddress serverEndpoint; 
System.ServiceModel.Channels.Binding binding; 

public client() 
{ 
InitializeComponent(); 
serverEndpoint = new EndpointAddress(new Uri(loggerGlobalStatics.namedPipeServerAddress)); 
       binding = new NetNamedPipeBinding(); 
       loggerChannelFactory = new ChannelFactory<IloggerWCFServiceChannel>(binding, serverEndpoint); 
       loggerChannelFactory.Open(); 
       loggerServiceChannel = loggerChannelFactory.CreateChannel(); 
       loggerServiceChannel.Open(); 

    .... 

private void eventLog1_EntryWritten(object sender, System.Diagnostics.EntryWrittenEventArgs e) 
      { 
       loggerServiceChannel.WriteEvent(e); 
      } 

Antwort

0

Der Grund dafür ist, dass EntryWrittenEventArgs keine Setter für Entry hat.

Weitere Informationen finden Sie unter this SO question.

Warum nicht einfach Entry direkt senden, ohne es in EntryWrittenEventArgs einzukapseln?

+0

Vielen Dank, das war der Deal. Anstatt die EntryWrittenEventArgs zu übergeben, habe ich das nur in Entry geändert und das weitergeleitet und voila :) Danke! –