我已经创建了一个简单的基于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