C# WCF服务主机接收空对象

C# WCF服务主机接收空对象,c#,.net,winforms,wcf,C#,.net,Winforms,Wcf,环境:Windows 10 x64上的.net 4.6.1 问题: 1.WCF契约通过事件实现。 2.每次客户端记录并调用事件日志条目时,服务主机都会触发该事件。 3.主机应用程序正确触发,但是对象(EventLogEntry)没有正确发布,并且始终为空。 4.在调试过程中,我检查了客户端Winforms应用程序是否传递了一个实例化对象。不知怎么的,这并没有达到目的 服务器端。 5.在此阶段,客户机和服务器都位于同一台机器上 问题: 为什么对象为空?我如何修复此问题 WCF服务代码: [Serv

环境:Windows 10 x64上的.net 4.6.1

问题: 1.WCF契约通过事件实现。 2.每次客户端记录并调用事件日志条目时,服务主机都会触发该事件。 3.主机应用程序正确触发,但是对象(EventLogEntry)没有正确发布,并且始终为空。 4.在调试过程中,我检查了客户端Winforms应用程序是否传递了一个实例化对象。不知怎么的,这并没有达到目的 服务器端。 5.在此阶段,客户机和服务器都位于同一台机器上

问题: 为什么对象为空?我如何修复此问题

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

    }

}
[服务合同]
公共接口IloggerWCFServiceContract
{
[运营合同(IsOneWay=true)]
无效WriteEvent(EntryWriteTenEventArgs e);
[运营合同(IsOneWay=true)]
[ServiceKnownType(typeof(EventLogEntry))]
无效一次写入(EntryWrittenEventArgs e);
}
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
公共类wcf_logger_服务库:IloggerWCFServiceContract
{
公共事件处理程序eventwrited;
公共无效OneVentWrited(EntryWrittenEventTargets e)
{
if(eventwrited!=null)
本。事件书写(本,e);
}
公共无效WriteEvent(EntryWriteTenEventArgs e)
{
OneVentWrited(新条目WrittenEventargs(e.条目));
}
}
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_logger_servicebase loggerwcfsservice=new wcf_logger_servicebase();
ServiceHost loggerServiceHost=新ServiceHost(loggerWCFService,新Uri(loggerGlobalStatics.namedPipeServerAddress));
loggerWCFService.eventwrited+=新的EventHandler(EventHandler\u entrywrited);
.....    
loggerServiceHost.AddServiceEndpoint(typeof(IloggerWCFServiceContract)、新NetNamedPipeBinding()、loggerGlobalStatics.namedPipeServerAddress);
loggerServiceHost.Open();
......
私有void eventhandler\u entrywrited(对象发送方,entrywriteteneventargs 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);
            }
ChannelFactory日志ChannelFactory;
IloggerWCFServiceChannel loggerServiceChannel=null;
wcf_logger_servicebase loggerwcfsservice=新的wcf_logger_servicebase();
端点地址服务器端点;
System.ServiceModel.Channels.Binding绑定;
公共客户机()
{
初始化组件();
serverEndpoint=newEndpointAddress(新Uri(loggerGlobalStatics.namedPipeServerAddress));
binding=新的NetNamedPipeBinding();
loggerChannelFactory=新的ChannelFactory(绑定,serverEndpoint);
loggerChannelFactory.Open();
loggerServiceChannel=loggerChannelFactory.CreateChannel();
loggerServiceChannel.Open();
....
私有void eventLog1\u entrywrited(对象发送方,System.Diagnostics.entrywriteneventargs e)
{
loggerServiceChannel.WriteEvent(e);
}

原因是
entrywriteneventargs
没有
条目的setter

有关更多详细信息,请参阅


为什么不直接发送
条目
,而不将其封装在
entrywriteneventargs
中?

原因是
entrywriteneventargs
没有
条目的setter

有关更多详细信息,请参阅


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

非常感谢,这就是交易。我没有传递entrywriteneventargs,而是将其改为Entry only并传递给大家,瞧:)谢谢!非常感谢,这是交易。我没有传递entrywriteneventargsryWrittenEventArgs,我把这个改成了“仅输入”,然后把它传了过去,瞧:)谢谢!