2011-09-02 77 views
1

生成的代理類改變我知道標題是有點混亂,所以這裏是交代:引用類型是從WCF

我想流與WCF大文件,並且我種知道該怎麼辦它。

當我寫了一個方法,說:

[OperationContract] 
    void sendStream(System.IO.Stream _StreamSource); 

在那裏,生成的代理類的內心我的客戶端應用將正確有System.IO.Stream類型作爲輸入參數。

但如果我創建另一個類:

[MessageContract] 
[KnownType(typeof(Stream))] 
public class MyData 
{ 
    [MessageHeader(MustUnderstand = true)] 
    public string Key { get; set; } 
    [MessageBodyMember(Order = 1)] 
    public Stream Data { get; set; } 
} 

而且具有服務接口:

[OperationContract] 
    void sendStream(MyData _StreamSource); 

從邁德特在我的客戶端類的流類型將根據服務引用命名空間。

即:MyServiceRef.Stream

這讓我無法流傳遞給WCF。

但是,這不會發生字符串和整型的東西。

我不知道爲什麼,我throught流類型是已知的類型如String和int?

或者是否有任何解決方法?

在此先感謝!

回答

1

KnownType屬性指示WCF到類型定義添加到服務參考。看起來這也具有使DataContract內的KnownType的任何屬性使用服務生成類型的副作用。 (這對於KnownType的正常用法是有意義的,WCF不知道其類型。)

您是否嘗試使用合同而未聲明StreamKnownType

+0

我確實嘗試了,但它不起作用,這就是爲什麼我添加了KnownType來嘗試我的運氣 –

1

流不像int或string那樣可序列化。所以你不能將它們用作消息合約的屬性。

你可以,但是,使用流媒體在WCF:http://msdn.microsoft.com/en-us/library/ms731913.aspx,但是這需要有流作爲唯一的參數。

+0

但是,如果我不通過與客戶端共享服務接口來使用自動生成的代理類,使用ChannelFactory。那麼這是否意味着用自動生成的代理類來做到這一點? (是的,我在wcf中使用流媒體) –

+0

我承認我很驚訝這個工程與ChannelFactory ...如[鏈接]中所述(http://msdn.microsoft.com/en-us/library/ms731913 .aspx):'流式傳輸的限制:流式傳輸中發生的操作最多可以與一個輸入或輸出參數有關。該參數對應於消息的整個主體,並且必須是Message,派生類型的Stream或IXmlSerializable實現。具有操作的返回值相當於具有輸出參數。' –

+0

我猜這就是最多一個輸入或輸出參數的含義是指上述代碼中的[MessageBody],因爲[MessageHeader]不是傳輸過程中流傳輸的一部分。流媒體部分應該是[MessageBody]。 (並且我試圖在代碼中創建另一個[MessageBody],它給了我一個錯誤:「爲了將Streams與MessageContract編程模型一起使用,MyData類型必須具有帶MessageBodyMember屬性的單個成員,並且成員類型必須是Stream。 「) –