2014-02-28 38 views
1

嗨我想要反序列化一個HttpPost方法調用內的授權屬性。我使用ASP.NET Web Api框架。反序列化一個http post內的對象

這裏是我的代碼:

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 tryes到反序列化:

輸入流不是有效的二進制格式。起始內容(字節)爲:73-74-75-64-65-6E-74-41-73-73-69-67-6E-6D-65-6E-74 ...

我在做什麼錯?

回答

2

您正在嘗試使用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"]; 
+0

它似乎不工作,我收到似乎並不是JSON format.It數據看起來喜歡這樣的:「PERSONID = 4&studentId = 10」 – aleczandru

+0

在這種情況下使用[HttpUtility.ParseQueryString](HTTP: //msdn.microsoft.com/en-us/library/ms150046.aspx)方法。見編輯的答案。 –

+0

**另一種解決方案**。我能夠使用[this]將Query String'Key'和'Value'轉換爲Json格式(http://stackoverflow.com/questions/12428947/how-do-i-convert-a-querystring-toa-a- json的字符串)和[這](http://stackoverflow.com/questions/24052372/deserialize-http-post-parameters)後。希望有助於。 – stom