如何反序列化来自.net WebClient的包含HTTP POST参数的字节数组

本文关键字:POST HTTP 参数 字节 数组 字节数 包含 反序列化 net WebClient | 更新日期: 2023-09-27 18:10:30

我正在使用WebClient发送一个HTTP POST请求到远程URL,如下所示:

byte[] responsebytes = client.UploadValues(
                        "https://www.jaja.com/yadayadayada", "POST", reqparm);
responsebody = Encoding.UTF8.GetString(responsebytes);

URL以HTTP POST参数的形式给出响应,例如:

"状态= Ok& BrowserUrl 3 = http % % 2 f % 2 fwww.jaja.com % 3 a7106 % 2 fxxx&散列= 8614 c21dd93749339906db35c51b06006b33dc8c192f40dfe2db6549942c837c4452e1d1333de9db7814b278c8b9e3c34d1a76d2f937dee57502336e0a071412"

我在这里面临的问题是我如何序列化这个响应到这个类的对象:

public class PaynowResponseModel : PayNowBase
    {
        public string browserurl { get; set; }
        public string pollurl { get; set; }
        public string status { get; set; }
        public string hash { get; set; }
    }

我试过下面的方法

public static object ByteArrayToObject(Byte[] buffer)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            MemoryStream stream = new MemoryStream(buffer);
            object rval = formatter.Deserialize(stream);
            stream.Close();
            return rval;
        }

我这样调用:

var responseObj = (PaynowResponseModel) General.ByteArrayToObject(responsebytes);

但是它不起作用。我在ByteArrayToObject方法中得到一个异常

System.Runtime.Serialization。SerializationException被捕获
HResult=-2146233076 Message=输入流不是有效的二进制格式。起始内容(以字节为单位)为:73 - 74 - 61 - 74 - 75 - 73 - 3 - d - 4 - f - 6 b - 26 - 62 - 72 - 6 - f - 77 - 73 - 65 - 72,
源= mscorlib加:System.Runtime.Serialization.Formatters.Binary.SerializationHeaderRecord.Read (__BinaryParser输入)在System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadSerializationHeaderRecord ()在System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run ()System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize (HeaderHandler__BinaryParser; serParser; BooleanisCrossAppDomain, IMethodCallMessageSystem.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(流serializationStream, HeaderHandler handler, BooleanisCrossAppDomain, IMethodCallMessageSystem.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(流serializationStream)

请帮助我如何解决这个问题,或者用另一种方法实现我的目标。

提前感谢:)

如何反序列化来自.net WebClient的包含HTTP POST参数的字节数组

不能直接反序列化字节数组,因为字节数组不是有效的PayNowResponseModel序列化对象。

使用HttpUtility.ParseQueryString(Encoding.UTF8.GetString(responsebytes))将检索到的字符串解析为NameValueCollection,然后创建一个转换器将数据转换为PayNowResponseModel对象。您可能需要添加对System的引用。Web)

看一下下面的示例:

        var resp = HttpUtility.ParseQueryString(responsebytes);
        var converted = new PaynowResponseModel();
        converted.browserurl = resp["BrowserUrl"];
        converted.status = resp["Status"];
        converted.hash = resp["Hash"];