如何在C#中使用datacontract?

时间:2015-04-08 14:33:22

标签: c# wcf

我在服务器端和客户端都有这个接口:

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主题的新手。

有人会如此友好地向我解释如何将所需的对象传递给客户?

3 个答案:

答案 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; }
    }
}

现在它就像一个魅力!