【问题标题】:Deserializing the object inside an http post反序列化 http 帖子中的对象
【发布时间】:2014-02-28 10:36:16
【问题描述】:

您好,我正在尝试从授权属性内的 HttpPost 方法调用反序列化对象。我正在使用 ASP.NET Web Api Framework。

这是我的代码:

public override void OnAuthorization(HttpActionContext actionContext)
    {

      var rezult = DeserializeStream<EvaluationFormDataContract>(actionContext.Request.Content.ReadAsStreamAsync().Result);

    }

    private T DeserializeStream<T>(Stream stream)
    {
        var binaryFormatter = new BinaryFormatter();

        var rez = binaryFormatter.Deserialize(stream);

        var t = (T)binaryFormatter.Deserialize(stream);
        return t;
    }

当这个代码被执行时,当 binaryFormatter 试图反序列化它时,我得到了这个异常:

输入流不是有效的二进制格式。起始内容(以字节为单位)为:73-74-75-64-65-6E-74-41-73-73-69-67-6E-6D-65-6E-74 ...

我做错了什么?

【问题讨论】:

    标签: c# .net asp.net-web-api


    【解决方案1】:

    您正在尝试使用BinaryFormatter 对未二进制序列化的数据进行二进制反序列化。从您发送的数据中,我看到十六进制代码代表一个字符串。

    73-74-75-64-65-6E-74-41-73-73-69-67-6E-6D-65-6E-74解码为studentAssignment

    这让我相信您正在执行一个简单的 AJAX 调用并将 JSON 数据发送到 WebAPI 服务。

    您需要使用 JSON 反序列化流。

    1. 以字符串形式读取请求内容
    2. 如果内容是 JSON,则使用 JSON.NET 对其进行反序列化

    var json = actionContext.Request.Content.ReadAsStringAsync().Result;
    var m = JsonConvert.DeserializeObject<EvaluationFormDataContract>(json);
    

    如果响应不是 JSON,而是表单数据,您可以像查询字符串一样解析它。

    var stringData = actionContext.Request.Content.ReadAsStringAsync().Result;
    NameValueCollection data = HttpUtility.ParseQueryString(stringData);
    string personId = data["personId"];
    

    【讨论】:

    • 它似乎不起作用我收到的数据似乎不是 json 格式。它看起来像这样:“personId=4&studentId=10”
    • 在这种情况下使用HttpUtility.ParseQueryString 方法。请参阅编辑后的答案。
    • 另一种解决方案。我能够使用thisthis 帖子将查询字符串KeyValue 转换为Json 格式。希望有所帮助。
    猜你喜欢
    • 2018-10-10
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    相关资源
    最近更新 更多