2012-11-20 32 views
2

我需要從WCF服務器返回一個大字節數組。從WCF返回大字節數組 - 內存問題

問題是 - 爲了返回這樣一個數組 - 我需要創建一個 - 當創建這樣一個數組時 - 它會自動進入大對象堆 - 這意味着當服務受到壓力時 - 我得到內存使用和管理中的一個實際問題。

我想過使用非託管內存來避免使用大的託管字節數組 - 但仍然如何從WCF服務返回這樣的數組?

是否有任何方式從WCF服務返回字節的「流」,其中不包括實際創建託管字節數組?我知道WCF本身使用一個BufferManager--所以如果它只是讀取我的非託管內存並在發送之前使用它的緩衝區管理來存儲它 - 我希望不會有問題。

+0

您可以嘗試將其寫入文件並讓客戶端下載文件? – ryadavilli

+1

是的,你可以返回'Stream'。你爲什麼不試試。 –

+0

ryadavilli - 恐怕寫入和讀取文件是1.在某些情況下(數據敏感時)不安全,並且2.需要性能差的IO –

回答

2

您可以使用WCF的Streaming Mode。從這個頁面:

  1. 要流數據時,OperationContract的該服務必須滿足兩個要求:

    一個。保存要流式傳輸的數據的參數必須是該方法中唯一的參數 。例如,如果輸入消息是要流式傳輸的一個 ,則該操作必須只有一個輸入參數。 同樣,如果輸出消息要流式傳輸,則操作必須具有一個輸出參數或一個返回值。

    b。參數和返回值類型中的至少一種必須是 或者Stream,MessageIXmlSerializable

  2. 必須在綁定上啓用流式傳輸。您設置TransferMode屬性,它可以採取以下值之一:

    a。緩衝,

    b。流式播放,可實現雙向流媒體通信。

    c。 StreamedRequest,僅支持流式傳輸請求。 d)。 StreamedResponse,它僅支持流式傳輸響應。

有一些頁面上一些體面的例子還有,包括如何寫回一個自定義的流(這是朝底部)。

有關編碼,流媒體和會話以及使用流媒體時的一些安全考慮因素的更多背景信息,請參閱this MSDN page

+0

聽起來很有希望 - 我會檢查一下。 –

+0

不幸的是,在檢查了限制之後 - 我的方法還返回了2個額外的輸出參數(這是必須的) - 任何方法繞過這個? –

+2

您可以嘗試使用OperationContext.OutgoingMessageHeaders屬性來傳遞消息頭中的參數。從http://msdn.microsoft.com/en-us/library/system.servicemodel.operationcontext.outgoingmessageheaders.aspx:「使用此屬性添加由服務操作發送的回覆標頭或由WCF客戶端對象「。 有一些很好的例子,在http://stackoverflow.com/questions/964433/how-to-add-a-custom-header-to-every-wcf-calls/ – schellack