反序列化http帖子中的对象

时间:2014-02-28 10:36:16

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

您好我正在尝试从授权属性中的HttpPost方法调用反序列化一个Object。我正在使用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 ...

我做错了什么?

1 个答案:

答案 0 :(得分:2)

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

已解码的{p> 73-74-75-64-65-6E-74-41-73-73-69-67-6E-6D-65-6E-74studentAssignment

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

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

  1. 以字符串
  2. 读取请求内容
  3. 如果内容是JSON,请使用JSON.NET
  4. 对其进行反序列化
    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"];