2011-02-16 31 views
3

我正在使用一个webservice,吐出大量的数据在一块。响应字符串可以是8MB。虽然在台式电脑上不是问题,但嵌入式设备在处理一个8MB的字符串对象时很麻烦。SoapHttpClientProtocol:获取响应而不是字符串?

我想知道是否有方法将响应作为流?目前我正在使用下面的方法。我尝试使用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])); 
    } 

回答

1

如果您使用旧的ASMX Web服务客户端基础结构,那么您就会受其限制。一个限制是,除了反序列化的数据外,没有简单的方法来获得响应。

如果有必要,那么您可以使用部分类覆盖GetWebResponse方法以返回您自己的定制WebResponse。后者将依次覆盖调用基本版本的GetResponseStream方法,使用流,然后返回包含“空”Web请求的流(否则.NET将在没有内容的流上扼流)。

您也可以通过覆盖GetReaderForMessage方法尝试类似的方法。这通过了一个SoapClientMessage实例,它具有您可能可以使用的Stream属性。同样,您必须将流设置为Web服务基础结构可以使用的内容。

更好的方法是使用WCF客户端。 WCF具有更强大和易于使用的可扩展性机制。

事实上,你可能甚至不需要扩展一个WCF客户端。你可以简单地将其配置为根本不存在这个缓冲问题。

+0

如果我连接到使用WCF,而不是ASMX我的web服务,这将帮助我?或者我会得到包裹在WCF中的SAOP响应并且有相同的问题? – Krumelur 2011-02-16 21:26:47

1

任何Web服务调用都将返回SOAP,不是吗?我不认为一个流可能会被串行化为一个soap包,以便从您的服务中返回。即使可能,序列化的流不会像字符串本身一样大吗?

1

我相信答案是否定的,没有SOAP流的概念。

也许最简单的答案就是你的方法:

  • 解析你的回应到细分您的移动设备可以处理
  • 缓存您的应用程序变量的响应,因为这些段
  • 回报的字典GUID的阵列列表。

然后,您可以让您的客户端通过它们的GUID分别请求这些段中的每一个,然后在处理所有Web服务返回时重新组合原始响应。

相关问题