2011-02-16 30 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服務返回時重新組合原始響應。

相關問題