我在服务器端和客户端都有这个接口:
namespace BH_Server {
[ServiceContract]
public interface BHInterface {
[OperationContract]
string GetName( string name );
[OperationContract]
Device GetDevice();
}
[DataContract]
public class Device {
private string dSN;
[DataMember]
public string SN {
get { return dSN; }
set { dSN = value; }
}
}
}
另外,我在服务器端有这个:
public class CronServiceInterface : BHInterface {
public string GetName( string name ) {
return string.Format( "Hello {0}", name );
}
public Device GetDevice() {
Device d = new Device();
d.SN = "123456789";
return d;
}
}
这在服务器端,也是:
host = new ServiceHost( typeof( CronServiceInterface ), new Uri[] {
new Uri("net.pipe://localhost/")
} );
host.AddServiceEndpoint( typeof( BHInterface ), new NetNamedPipeBinding( NetNamedPipeSecurityMode.None ), "BhPipe" );
host.Open();
要在客户端创建连接,请使用以下代码:
NetNamedPipeBinding binding = new NetNamedPipeBinding( NetNamedPipeSecurityMode.None );
ChannelFactory<BHInterface> channelFactory = new ChannelFactory<BHInterface>( binding );
EndpointAddress endpointAddress = new EndpointAddress( "net.pipe://localhost/BhPipe/" );
BHInterface iface = channelFactory.CreateChannel( endpointAddress );
显然不是所有代码都写在这里,我希望它足以看到实现的内容。
在客户端使用Debug.WriteLine( iface.GetName("Tom") );
结果“Hello Tom”,但以下代码不起作用:
Device d;
d = iface.GetDevice();
Debug.WriteLine( string.Format( "Printing sn: {0}", d.SN ) );
它打印:“打印sn:”。
我正在使用.NET 4.5并且没有抛出错误。我是WCF主题的新手。
有人会如此友好地向我解释如何将所需的对象传递给客户?
答案 0 :(得分:0)
要解决此问题,只需删除属性的支持字段,并将DataContract
定义为
[DataContract]
public class Device {
[DataMember]
public string SN {get;set;}
}
原因是dSN
的值不是从服务发送到客户端,因为它不是[DataMember]
。其他解决方案是使用[DataMember]
属性标记私有字段,但通常应该避免这种做法。
此外,请记住在对数据合同进行任何更改后更新服务引用,否则客户端仍会看到旧合同。
答案 1 :(得分:0)
详细说明......就像ServiceContract和OperationContract显示原型实现了实现一样,DataContract和DataMembers也是如此。您正在实施
get { return dSN; }
set { dSN = value; }
所有需要的是
public string SN {get;set;}
答案 2 :(得分:0)
我必须在我的datacontracts中使用属性!
namespace BH_Server {
[ServiceContract]
public interface BHInterface {
[OperationContract]
string GetName( string name );
[OperationContract]
Device GetDevice();
}
[DataContract( Name = "Device", Namespace = "" )]
public class Device {
[DataMember( Name = "SN", Order = 1 )]
public string SN { get; set; }
}
}
现在它就像一个魅力!