【问题标题】:How to map network response into a C# class?如何将网络响应映射到 C# 类?
【发布时间】:2016-12-23 17:27:23
【问题描述】:

我正在尝试通过 TCP/IP 协议与服务器通信。这是我的方法:

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

服务器将发送如下响应:

<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>

现在我有一个用于响应的 c# 类,我想知道如何将网络响应映射到我的类。我对此很陌生,我什至不确定我的 responseMessage 会是什么样子?谁能给点意见?

【问题讨论】:

    标签: c# serialization deserialization tcpclient networkstream


    【解决方案1】:

    如果您正在使用,则基于该休息创建一个类:

    [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; }
        }
    

    然后将其反序列化以将数据作为一个类处理:

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

    或使用 StringReader:

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

    【讨论】:

      猜你喜欢
      • 2017-08-30
      • 1970-01-01
      • 2020-09-13
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 2014-01-21
      • 2018-11-07
      • 2021-05-23
      相关资源
      最近更新 更多