如何反序列化来自.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)
请帮助我如何解决这个问题,或者用另一种方法实现我的目标。
提前感谢:)
不能直接反序列化字节数组,因为字节数组不是有效的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"];