2011-05-23 60 views
2

根據MSDN上的以下指南,任何使用流式傳輸的操作只能有一個輸入/輸出參數。使用WCF流式傳輸限制

鏈接:http://msdn.microsoft.com/en-us/library/ms731913.aspx(見標題「關於流傳輸限制」)

我使用流式傳輸的WCF服務,讓客戶/消費者將文件上傳到它。上傳本身工作正常,但我需要一種傳遞兩個輸入參數以及Stream對象的方式:'string filename'和'int userid'。

我該怎麼做呢?

回答

4

There's一些所謂的頭,你可以在你的datacontract使用:

實例的接口:

[ServiceContract] 
public interface IFile 
{ 
    [OperationContract] 
    Stream DownloadFile(int fileid); 

    [OperationContract] 
    bool UploadFile(FileUploadMessage request); 
} 

將這個單獨的文件:

[MessageContract] 
public class FileUploadMessage 
{ 
[MessageHeader(MustUnderstand = true)] 
public int MyInt {get;set; 

[MessageHeader(MustUnderstand = true)] 
public string MyString {get;set; 

[MessageBodyMember(Order = 1)] 
public System.IO.Stream FileByteStream {get;set;} 
} 
+0

我得到錯誤「接口不能聲明類型」當我加入你的代碼我的ServiceContract。這就是它現在的樣子:http://pastebin.com/xaFM4EDN – rafale 2011-05-23 20:33:45

+0

我將MessageContract移到了ServiceContract之外,現在似乎正在編譯。不過,我不確定如何使用消息合約。我從哪裏出發?鏈接:http://pastebin.com/ykrvgEfi – rafale 2011-05-23 21:33:31

+0

嗨!接口不能像你注意到的那樣在自己內部聲明類,所以把它放在一個單獨的文件/類中是完全正確的。 接下來,使用該類作爲更新示例中所示方法的輸入參數。然後,您只需使用request.FileByteStream從服務中的流中讀取。 – Almund 2011-05-25 12:45:05

0

我有有點類似的問題。我創建了一個測試項目,並使用一篇文章發現成功創建一個wcf服務,並從另一個項目調用它。我有一個解決方案和兩個Web項目。一個項目使用服務參考在另一個項目中調用該服務。 我在通過創建一個wcf服務(以「I」開頭的文件)生成的接口文件中擁有ServiceContract和消息協定。所有這一切都很好。然後我去了我們公司的主要項目。它有一個主要的web項目,主持兩個silverlight項目。然而,網絡項目並不是一個真正的項目,而是一個沒有任何項目的網站。我曾假設將兩個silverlight項目添加到網站可能爲所有三個項目創建了一個解決方案。然而,我不確定vs2010如何看待我認爲的主要網站沒有指向任何文件的「真實」項目。 當我在主網站創建wcf服務並將ServiceContract和MessageContract放入接口文件時發生了什麼我得到了有關MessageContract及其子類的「接口無法聲明類型」的問題。我試圖按照你的建議採取MessageContract並將其放入另一個文件,但我不知道什麼類型的文件。我嘗試將消息合約放入類(cs文件)中。但是,ServiceContract引用MessageContract中的類,即使它們是公共的,ServiceContract也不再看到MessageContract中的類。 我應該使用哪種類型的文件將消息合約與ServiceContract分開?

感謝, 圖

+0

聲明他們在一個單獨的CS文件是好的。確保您的合同/接口聲明與實現它們的類位於相同的名稱空間中。否則,它們彼此不可見。 – rafale 2011-08-11 08:19:09