2011-09-02 65 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。 “) –