我已經創建了一個簡單的基於REST的WCF服務,它在BasicHttpBinding上運行。在我的一個webmethod中,我返回一個指向JSON響應的Stream。MemoryStream數據損壞問題
的方法是這樣的:
[OperationContract]
[FaultContract(typeof(ApplicationFault))]
[WebInvoke(Method = "POST", UriTemplate = "GetActiveCalls/{nurseid}")]
Stream GetActiveCalls(string nurseid);
從GetActiveCalls的身體,我創建的MemoryStream的對象,並返回相同的響應。代碼如下當從客戶端嘗試這種像
// Serialize the results as JSON
string jsonResult = new JavaScriptSerializer().Serialize(baseResponses);
// ContentType json
WebOperationContext.Current.OutgoingResponse.ContentType = "application/json";
WebOperationContext.Current.OutgoingResponse.Headers.Add("Cache-Control", "no-cache");
var bytes = Encoding.UTF8.GetBytes(jsonResult);
//Parse to memorystream
var ms = new MemoryStream(bytes);
ms.Seek(0, SeekOrigin.Begin);
ms.SetLength(bytes.LongLength);
return ms;
,我得到的結果一樣
{"LastEvents":[{"FormatValues":"Klic 2 3 4","Icon":null,"Color":"Red","Acknowledged":false,"EventID":28566}],"Message":"","Status":true}
但有時調用多次同樣的方法後,我開始得到響應爲:
{"LastEvents":[{"FormatValues":"Klic 2 3 4","Icon":null,"Color":"Red","Acknowledged":false,"EventID":28566}],"Message":"","Statu{"LastEv
您可以在「Statu on the JSON response」後看到,流被重置並開始從頭開始獲取數據。
我看起來很奇怪。有人可以指出,如果我失去了一些東西。
*從服務器端,當我把斷點,似乎MemoryStream有正確的響應。
好奇,是否有手動序列化這個原因?如果你所做的只是傳回一個'MemoryStream',那麼你沒有太多節省,因爲你必須在發送完成之前實現完整的結果集。如果你發回JSON,你通常不需要它。 – casperOne
嗯。你的意思是我不需要Serilize對象,而是直接寫對象? – abhishek
是的,爲什麼不只是讓對象的返回值,並讓WCF通過電線處理序列化? – casperOne