【问题标题】:How to deserialise a byte array containing HTTP POST parameters from a .NET WebClient如何反序列化包含来自 .NET WebClient 的 HTTP POST 参数的字节数组
【发布时间】:2015-08-31 18:23:32
【问题描述】:

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

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

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

“状态= OK&BrowserUrl = HTTP%3A%2F%2fwww.jaja.com%3a7106%2fxxx&散列= 8614C21DD93749339906DB35C51B06006B33DC8C192F40DFE2DB6549942C837C4452E1D1333DE9DB7814B278C8B9E3C34D1A76D2F937DEE57502336E0A071412” P>

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

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 消息=输入流不是有效的二进制文件 格式。起始内容(以字节为单位)是: 73-74-61-74-75-73-3D-4F-6B-26-62-72-6F-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,布尔 fCheck,布尔 isCrossAppDomain, IMethodCallMessage 方法CallMessage) 在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(流 serializationStream, HeaderHandler 处理程序, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage 方法CallMessage) 在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(流 序列化流)

请协助我如何解决这个问题或在那里实现我的目标的替代方法。

提前谢谢你:)

【问题讨论】:

    标签: c# .net asp.net-mvc serialization webclient


    【解决方案1】:

    您不能直接反序列化字节数组,因为字节数组不是有效的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"];
    

    【讨论】:

    • 太棒了,这是完美的解决方案。简单明了。非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    相关资源
    最近更新 更多