2012-11-07 145 views
0

我已經創建了一個簡單的基於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有正確的響應。

+0

好奇,是否有手動序列化這個原因?如果你所做的只是傳回一個'MemoryStream',那麼你沒有太多節省,因爲你必須在發送完成之前實現完整的結果集。如果你發回JSON,你通常不需要它。 – casperOne

+0

嗯。你的意思是我不需要Serilize對象,而是直接寫對象? – abhishek

+0

是的,爲什麼不只是讓對象的返回值,並讓WCF通過電線處理序列化? – casperOne

回答

3

不考慮使用內存流的問題,最近我遇到了一個類似的問題,那就是內存流響應似乎是隨機地出現了損壞。解決這個問題的方法是從web.config中刪除跟蹤部分,這是我在dev模式下打開的。這可能是也可能不是你的問題,但它可能值得看看。好像這個問題在.NET 4.5中仍然存在。

+0

我已經解決了這個問題。但仍然感謝爲wiki貢獻力量。 :) – abhishek

+0

@ aldous-zodiac - 輝煌!我有同樣的問題;奇怪的是,對於相同的數據,它始終在相同的點和相同數量的請求中被破壞(對於來自服務器的前八個請求,在第九個請求時它會損壞)。一旦我遵循了你的建議並禁用了追蹤,我就可以儘可能多地請求它,而不會造成任何損壞。 – Nick