我正在使用一个Web服务,它将大量数据一起吐出。响应字符串可以是8MB。虽然在桌面PC上不是问题,但嵌入式设备对于处理8MB字符串对象感到困惑。
我想知道是否有办法将响应作为流进行处理?目前我正在使用如下方法。我尝试使用POST请求,但SOAP更方便(响应是XML,而POST我必须将纯文本回复转换回有效的XML),我想坚持下去。是否可以使用不同类型的“Invoke”,它不会返回字符串而是流?有任何想法吗?
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("MyAPI/MyMethod", RequestNamespace="MyAPI", ResponseNamespace="MyAPI", ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped, Use=System.Web.Services.Description.SoapBindingUse.Literal)]
public string MyMethod(string sID)
{
object[] results = this.Invoke("MyMethod", new object[] { sID });
return ((string)(results[0]));
}
答案 0 :(得分:1)
任何Web服务调用都将返回SOAP,不是吗?我不认为流可以序列化为从您的服务返回的soap数据包。即使它可以,序列化流不会至少与字符串本身一样大吗?
答案 1 :(得分:1)
我认为答案是否定的,没有SOAP流的概念。
最简单的答案可能是你的方法:
然后,您可以让客户端通过其GUID分别请求每个段,然后在处理所有Web服务返回时重新组合原始响应。
答案 2 :(得分:1)
如果您使用旧的ASMX Web服务客户端基础结构,那么您就会遇到其局限性。一个限制是除了作为反序列化数据之外,没有简单的方法来获得响应。
如果有必要,您可以使用部分类覆盖GetWebResponse
方法以返回自己的自定义WebResponse
。后者将依次覆盖GetResponseStream
方法来调用基本版本,使用流,然后返回包含“空”Web请求的流(否则.NET将阻塞没有内容的流)。 / p>
您也可以通过覆盖GetReaderForMessage
方法尝试类似的操作。这是通过SoapClientMessage
实例传递的,该实例具有您可以使用的Stream
属性。同样,您必须将流设置为Web服务基础结构可以使用的内容。
更好的方法是使用WCF客户端。 WCF具有更强大且易于使用的可扩展性机制。
实际上,您甚至可能不需要扩展WCF客户端。您可能只是能够将其配置为根本没有此缓冲问题。
答案 3 :(得分:1)
ASMX对此无能为力。 WCF的BasicHttpBinding 可以将一个Stream返回给调用者。