2016-12-23 4 views
1

J'essaie de communiquer avec un serveur via le protocole TCP/IP. Voici ma méthode:Comment mapper la réponse réseau dans une classe C#?

private bool SendTcpRequest<T>(T request, Settings settings) 
    { 
     try 
     { 
      TcpClient client = new TcpClient(settings.Url, settings.Port); 

      byte[] data = null; 

      if (!string.IsNullOrEmpty(request.ToString())) 
       data = Encoding.ASCII.GetBytes(request.ToString()); 
      NetworkStream stream = client.GetStream(); 

      if (stream.CanWrite) 
       stream.Write(data, 0, data.Length); 
      else 
      { 
       return false; 
      } 

      if (stream.CanRead) 
      { 
       byte[] myReadBuffer = new byte[client.ReceiveBufferSize]; 
       IFormatter formatter = new BinaryFormatter(); 

       do 
       { 
        var numberOfBytesRead = stream.Read(myReadBuffer, 0, client.ReceiveBufferSize); 

        responseMessage = new StringBuilder(); 
        responseMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead)); 
       } 
       while (stream.DataAvailable); 
      } 
      else 
      { 
       return false; 
      } 
      stream.Close(); 
      client.Close(); 
      return true; 
     } 
     catch (ArgumentNullException e) 
     { 
      return false; 
     } 
     catch (SocketException e) 
     { 
      return false; 
     } 
    } 

Le serveur envoie une réponse comme ci-dessous:

<TOPUPRESPONSE> 
    <RESULT>00</RESULT> // status of the transaction 
    <RESULTTEXT>transaction successful</RESULTTEXT> //description of the result code 
    <TERMINALID>69500002</TERMINALID> 
    <TXID>0803170919092</TXID> 
    <PRODUCTID>XYZ</PRODUCTID> 
</TOPUPRESPONSE> 

Maintenant je classe aC# pour la réponse, je me demande comment je peux cartographier la réponse du réseau à ma classe . Je suis assez nouveau dans ce domaine, je ne suis même pas sûr de savoir à quoi ressemblera mon ResponseMessage? Quelqu'un peut-il donner une idée s'il vous plaît?

Répondre

2

Créer une classe en fonction de ce repos si c'est ce que votre travail avec:

[XmlRoot(ElementName="TOPUPRESPONSE")] 
    public class TOPUPRESPONSE { 
     [XmlElement(ElementName="RESULT")] 
     public string RESULT { get; set; } 
     [XmlElement(ElementName="RESULTTEXT")] 
     public string RESULTTEXT { get; set; } 
     [XmlElement(ElementName="TERMINALID")] 
     public string TERMINALID { get; set; } 
     [XmlElement(ElementName="TXID")] 
     public string TXID { get; set; } 
     [XmlElement(ElementName="PRODUCTID")] 
     public string PRODUCTID { get; set; } 
    } 

Ensuite, il suffit désérialiser à travailler avec les données en tant que classe:

XmlSerializer serializer = new XmlSerializer(typeof(TOPUPRESPONSE)); 
MemoryStream memStream = new MemoryStream(Encoding.UTF8.GetBytes(inputString)); 
msg resultingMessage = (TOPUPRESPONSE)serializer.Deserialize(memStream); 

ou utilisez un StringReader:

XmlSerializer serializer = new XmlSerializer(typeof(TOPUPRESPONSE)); 
StringReader rdr = new StringReader(inputString); 
msg resultingMessage = (TOPUPRESPONSE)serializer.Deserialize(rdr);