在从WCF生成的代理类中更改引用类型

时间:2011-09-02 13:07:36

标签: c# wcf visual-studio-2010

我知道标题有点令人困惑,所以这里有解释:

我正在尝试使用WCF流式传输大型文件,我知道该怎么做。

当我写一个方法时说:

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

在那里,生成的代理类在我的Client App中将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);

我的客户端类中MyData的流类型将位于Service Reference命名空间下。

即:MyServiceRef.Stream

这使我无法将流传递给WCF。

但是对于string和int的东西不会发生这种情况。

我想知道为什么,我通过Stream类型已知类型如string和int?

或者有解决方法吗?

提前致谢!

2 个答案:

答案 0 :(得分:1)

KnownType属性指示WCF将类型定义添加到服务引用。看起来这也有副作用,即在DataContract中使KnownType的任何属性使用服务生成的类型。 (这对于KnownType的正常使用是有意义的,其中WCF不知道该类型。)

您是否尝试使用合约而未将Stream声明为KnownType

答案 1 :(得分:1)

Stream不像int或string那样可序列化。因此,您不能将它们用作messagecontract的属性。

但是,您可以在wcf:http://msdn.microsoft.com/en-us/library/ms731913.aspx中使用流媒体,但这需要将流作为唯一参数。