2014-02-17 3 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 함수를 실행하려고하면 제대로 작동하고 간단한 문자열을 반환합니다. 어쩌면 다른 방법으로 수업을 구성해야합니까? 그들은 단지 [Serializable]을 경우 그것은 또한 작동 할 수있는 동안 나는

+3

데이터 및 동작을 분할하는 데 도움이됩니다. – Alex

+3

"더미"개체를 반환하십시오. 즉,'getAll' 메소드에 의존하지 마십시오. –

+0

왜 private 필드 ('livePacketDevice')에'[DataMember]'를 넣었으며'PacketDevice'는 직렬화 가능한 객체입니까? – Alberto

답변

0

LivePacketDevicePacketDevice[DataContract]의 할 필요가 각 회원에 [DataMember]을 추가했습니다. 그렇지 않으면 WCF는 클라이언트로 전송하는 방법을 알지 못합니다.

또한 기능이 아닌 데이터를 보유하고있는 객체 만 전송하는 것이 좋습니다. 기능은 클라이언트에서 사용할 수 없기 때문입니다. 클라이언트 측에서 작성된 스텁에는 코드가 전송/복제되지 않으므로 메소드가 아닌 데이터 필드 만 포함됩니다.

+0

'[DataContract]'에는 [Serializable]'이 필요하지 않습니다. 그것은 완벽하게 작동합니다 – Franck

+0

@ Franck 알아요. 그래서 나는 그들이 [DataContract]가되어야한다고 썼다. 필자가 확신 할 수없는 것은 단지 * [DataContract]가 아닌'[Serializable]'* 일 수 있는지 여부이다. (그리고 내가 Rudresh의 답변에 대해 언급 한 이유이기도합니다.) –

관련 문제