WCF服务主机接收空对象

时间:2016-05-07 20:53:39

标签: c# .net winforms wcf

在Windows 10 x64上

环境: .net 4.6.1

问题:    1.通过事件实施的WCF合同。    2.每次记录事件日志条目并由客户端调用时,服务主机将触发事件。    3.主机应用程序正确触发,但对象(EventLogEntry)未正确发布并始终为null。    4.我在调试期间检查过客户端Winforms应用程序传递实例化对象。这在某种程度上无法实现    服务器端。    5.在此阶段,客户端和服务器都在同一台机器上。

问题: 为什么对象为null,我该如何解决这个问题?

WCF服务代码:

[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服务器代码:

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客户端代码:

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);
            }

1 个答案:

答案 0 :(得分:0)

原因是EntryWrittenEventArgs没有Entry的设置器。

有关详细信息,请参阅this SO question

为什么不直接发送Entry而不将其封装在EntryWrittenEventArgs中?