2014-02-17 143 views
0

我有应用程序主机WCF service,我想回到这个类对象:从WCF服务返回我的对象​​。

namespace classes 
{ 
    [DataContract] 
    public class NetworkAdapter 
    { 
     [DataMember] 
     public string Name { get; set; } 
     [DataMember] 
     public string ID { get; set; } 
     [DataMember] 
     public string Description { get; set; } 
     [DataMember] 
     public string IPAddress { get; set; } 
     [DataMember] 
     private string gatewayIpAddress; 
     [DataMember] 
     public string Speed { get; set; } 
     [DataMember] 
     public string NetworkInterfaceType { get; set; } 
     [DataMember] 
     public string MacAddress { get; set; } 
     [DataMember] 
     private LivePacketDevice livePacketDevice; 
     [DataMember] 
     public PacketDevice PacketDevice { get { return livePacketDevice; } } 

     public NetworkAdapter(LivePacketDevice packetDevice) 
     { 
      livePacketDevice = packetDevice; 
     } 

     public override string ToString() 
     { 
      return Description; 
     } 

     public static NetworkAdapter[] getAll() 
     { 
      List<NetworkAdapter> list = new List<NetworkAdapter>(); 
      foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces()) 
       foreach (UnicastIPAddressInformation uniCast in adapter.GetIPProperties().UnicastAddresses) 
       { 
        if (!System.Net.IPAddress.IsLoopback(uniCast.Address) && uniCast.Address.AddressFamily != AddressFamily.InterNetworkV6) 
        { 
         StringBuilder gatewayIPAddresses = new StringBuilder(); 
         string gatewayIPAddressesDisplay = string.Empty; 
         foreach (var address in adapter.GetIPProperties().GatewayAddresses) 
         { 
          gatewayIPAddresses.Append(address.Address); 
          gatewayIPAddresses.Append(" "); 
         } 

         if (gatewayIPAddresses.Length > 0) 
         { 
          gatewayIPAddressesDisplay = gatewayIPAddresses.ToString().TrimEnd(' '); 
         } 

         if (!list.Any(l => l.ID == adapter.Id)) 
         { 
          list.Add(new NetworkAdapter(getDevice(adapter.Id)) 
          { 
           Name = adapter.Name, 
           ID = adapter.Id, 
           Description = adapter.Description, 
           IPAddress = uniCast.Address.ToString(), 
           NetworkInterfaceType = adapter.NetworkInterfaceType.ToString(), 
           Speed = adapter.Speed.ToString("#,##0"), 
           MacAddress = getMacAddress(adapter.GetPhysicalAddress().ToString()), 
           gatewayIpAddress = gatewayIPAddressesDisplay 
          }); 
         } 
        } 
       } 

      //return list.GroupBy(n => n.ID).Select(g => g.FirstOrDefault()).ToArray(); 
      return list.ToArray(); 
     } 

     private static LivePacketDevice getDevice(string id) 
     { 
      return LivePacketDevice.AllLocalMachine.First(x => x.Name.Contains(id)); 
     } 

     private static string getMacAddress(string oldMAC) 
     { 
      int count = 0; 
      string newMAC = oldMAC; 

      for (int i = 2; i < oldMAC.Length; i += 2) 
      { 
       newMAC = newMAC.Insert(i + count++, ":"); 
      } 

      return newMAC; 
     } 

     public string defaultGateway 
     { 
      get 
      { 
       if (gatewayIpAddress != "") 
       { 
        return gatewayIpAddress; 
       } 

       return "n/a"; 
      } 
     } 

     private static string getIpFourthSegment(string ipAddress) 
     { 
      try 
      { 
       string[] arr = ipAddress.Split('.'); 
       return arr[3]; 
      } 
      catch (Exception) 
      { 
       return null; 
      } 
     } 
    } 
} 

这是我的服务:

[ServiceContract()] 
public interface IService1 
{ 
    [OperationContract] 
    NetworkAdapter[] GetAdapters(); 

    [OperationContract] 
    string GetDate(); 
} 

[ServiceBehavior(
    ConcurrencyMode = ConcurrencyMode.Multiple, 
    InstanceContextMode = InstanceContextMode.PerSession)] 

public class service1 : IService1 
{ 
    public NetworkAdapter[] GetAdapters() 
    { 
     IEnumerable<NetworkAdapter> adapters = NetworkAdapter.getAll(); 
     return adapters.ToArray(); 
    } 

    public string GetDate() 
    { 
     return DateTime.Now.ToString(); 
    } 
} 

当我尝试运行GetAdapters功能得到这个错误:

An unhandled exception of type 'System.ServiceModel.CommunicationException' occurred in mscorlib.dll 

Additional information: The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was '00:00:59.9599960'. 

当试图运行GetDate函数它工作正常,并返回简单的字符串。 也许我需要以其他方式配置我的课程?我已经加入[DataMember]到每个成员

+3

我建议你分割数据和行为 – Alex

+3

尝试返回一个“虚拟”对象。换句话说,不要依赖你的getAll方法。 –

+0

为什么你将'[DataMember]放在私有字段('livePacketDevice')上,并且'PacketDevice'是一个可序列化的对象? – Alberto

回答

0

LivePacketDevicePacketDevice必须[DataContract] s左右,而这也可能,如果他们只是[Serializable]工作。否则WCF不知道如何将它们传输到客户端。

此外,建议仅传输仅保存数据的对象,而不是功能,因为该功能对客户端不可用。在客户端创建的存根将只包含数据字段,而不包含方法,因为代码未被传输/克隆。

+0

'''[DataContract]'不需要'[Serializable]'。它工作完美无需 – Franck

+0

@Franck我知道。这就是为什么我写他们需要'[DataContract]'。我不确定的是,他们是否可以在没有[DataContract]的情况下成为'[Serializable]'*。 (这也是为什么我按照我的方式评论Rudresh的答案)。 –