SoapHttpClientProtocol:以流而不是字符串的形式获取响应?

时间:2011-02-16 02:13:07

标签: c# .net soap asmx

我正在使用一个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]));
    }

4 个答案:

答案 0 :(得分:1)

任何Web服务调用都将返回SOAP,不是吗?我不认为流可以序列化为从您的服务返回的soap数据包。即使它可以,序列化流不会至少与字符串本身一样大吗?

答案 1 :(得分:1)

我认为答案是否定的,没有SOAP流的概念。

最简单的答案可能是你的方法:

  • 将您的回复解析为移动设备可以处理的细分
  • 在应用程序变量中将响应缓存为这些段的字典
  • 返回GUID的arraylist。

然后,您可以让客户端通过其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返回给调用者。

http://msdn.microsoft.com/en-us/library/ms733742.aspx