2012-11-07 148 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