使用消息合同重用类型

时间:2014-12-24 17:08:53

标签: c# web-services wcf

我有一个WCF服务和一个客户端,我希望两者共享相同的类库,因此它们都可以访问相同的类型。我的问题是其中一个类是MessageContract,因为它是一个用于通过流式传输文件到服务器的对象。课程如下:

[MessageContract]
public class RemoteFileInfo : IDisposable
{

    private string fileName;
    private long length;
    private System.IO.Stream fileByteStream;

    public string FileName
    {
        set { this.fileName = value; }
        get { return this.fileName; }
    }

    public long Length
    {
        set { this.length = value; }
        get { return this.length; }
    }

    [MessageBodyMember(Order = 1)]
    public System.IO.Stream FileByteStream
    {
        set { this.fileByteStream = value; }
        get { return this.fileByteStream; }
    }

    public void Dispose()
    {
        if (fileByteStream != null)
        {
            fileByteStream.Dispose();
            fileByteStream = null;
        }
    }
}

此类包含在服务器和客户端之间共享的库中。如果我注释掉[MessageContract]的行,然后更新服务引用,我就能够与客户端成功共享该类型,并且服务引用不会尝试自行重新实现该类型。但是,为了使流工作正常,我需要确保此类确实是MessageContract,以便WCF服务知道只期望消息中的单个正文成员并适当地处理它。

如果我取消注释显示[MessageContract]的行并在客户端更新服务引用,它会尝试通过服务引用重新实现RemoteFileInfo,而不是重用RemoteFileInfo已存在于服务和客户端共享的库中。这意味着我最终得到了两个相同的类MyClientProject.Shared.RemoteFileInfoServiceReference.RemoteFileInfo,它们不明确并导致代码丢失大量错误。

我可以通过评论[MessageContract]行,更新服务引用,然后在启动服务之前取消注释服务端的行,来解决它(sloppily),因此客户端认为它只是一个普通的类,但WCF服务认为它是MessageContract。这似乎非常愚蠢,我相信这是一个更好的方法。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

由于您已经在共享所有数据合同,因此不共享服务合同接口的重点是什么,并且根本就避免执行代码生成?这会更有意义。