C# MemoryStream数据损坏问题

C# MemoryStream数据损坏问题,c#,wcf,rest,stream,basichttpbinding,C#,Wcf,Rest,Stream,Basichttpbinding,我创建了一个简单的基于REST的WCF服务,它运行在BasicHttpBinding上。在我的一个webmethod中,我返回一个指向JSON响应的流 该方法如下所示: [OperationContract] [FaultContract(typeof(ApplicationFault))] [WebInvoke(Method = "POST", UriTemplate = "GetActiveCalls/{nurseid}")] Stream GetActiveCalls(string nur

我创建了一个简单的基于REST的WCF服务,它运行在
BasicHttpBinding
上。在我的一个webmethod中,我返回一个指向JSON响应的流

该方法如下所示:

[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
您可以看到,在JSON响应上的Statu之后,流被重置并从一开始就开始获取数据

我觉得很奇怪


*从服务器端,当我放置断点时,似乎
内存流
有正确的响应。

抛开是否使用内存流的问题不谈,我最近遇到了一个类似的问题,内存流响应似乎随机损坏。这个问题的解决方案是删除跟踪部分我在开发模式下打开了web.config,这可能是您的问题,也可能不是您的问题,但可能值得一看。似乎这个问题在.NET 4.5中仍然存在。

抛开是否使用内存流的问题不谈,我最近遇到了一个类似的问题,内存流响应出现在这里ed已损坏,看起来是随机的。解决此问题的方法是从web.config中删除跟踪部分,我已在开发模式下打开了该部分。这可能是您的问题,也可能不是您的问题,但可能值得一看。似乎此问题在.NET 4.5中仍然存在。

奇怪,您手动序列化有什么原因吗这是什么?如果你所做的只是传回一个
MemoryStream
,那么你就不会节省太多,因为你必须在发送之前具体化完整的结果集。如果你发回JSON,你通常不需要它。嗯。你的意思是我不需要序列化对象,而是直接编写对象?是的,为什么不直接进行return为您的对象赋值,并让WCF通过连线处理序列化?我刚刚更改了对象,现在返回该对象。我想现在我必须将该对象定义为DataContract?我已将DataContract属性添加到要返回的类中,现在服务似乎返回504个结果。奇怪的是,您手动执行此操作有什么原因吗序列化这个?如果你所做的只是传回一个
MemoryStream
,那么你就不会节省太多,因为你必须在发送之前具体化完整的结果集。如果你发回JSON,你通常不需要它。嗯。你的意思是我不需要序列化对象,而是直接编写对象?是的,为什么不直接写呢将返回值设置为您的对象,并让WCF通过连线处理序列化?我刚刚更改了对象,现在返回该对象。我想现在我必须将该对象定义为DataContract?我已将DataContract属性添加到要返回的类中,现在服务似乎返回504个结果。我已修复了问题already.但仍然感谢您对维基的贡献。:@aldous zodiac-brilliant!我也遇到了同样的问题;奇怪的是,使用相同的数据,它总是在相同的点和相同数量的请求中损坏(对于来自服务器的前八个请求,这是可以的,对于第九个请求,它会损坏)。一旦我听从了你的建议并禁用了跟踪功能,我就可以随心所欲地处理所有请求,而不会出现任何损坏。我已经解决了这个问题。但仍然感谢你对维基的贡献。:@aldous zodiac-brilliant!我遇到了同样的问题;奇怪的是,使用相同的数据,它总是在同一点、同一时间损坏请求数(对于来自服务器的前八个请求,这是可以的,第九个请求可能会损坏)。一旦我听从您的建议并禁用跟踪,我就可以在不损坏的情况下通过任意多个请求。