C# 使用消息契约重用类型

C# 使用消息契约重用类型,c#,web-services,wcf,C#,Web Services,Wcf,我有一个WCF服务和一个客户端,我希望两者共享同一个类库,这样它们都可以访问相同的类型。我的问题是其中一个类是MessageContract,因为它是一个用于通过流媒体将文件上载到服务器的对象。课程安排如下: [MessageContract] public class RemoteFileInfo : IDisposable { private string fileName; private long length; private System.IO.Stream

我有一个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服务知道消息中只包含一个body成员,并适当地处理它

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


我可以通过注释掉
[MessageContract]
行,更新服务引用,然后在启动服务之前在服务端取消注释该行(草率地)来绕过它,因此客户端认为它只是一个普通类,而WCF服务认为它是
MessageContract
。这样做似乎很愚蠢,我相信有更好的方法。有什么想法吗?

既然您已经共享了所有的数据契约,那么不共享服务契约界面,而完全避免代码生成又有什么意义呢?这将更有意义。

这是一种方法,是的。但对于这个项目,我只是想弄清楚,我如何能够基本上拥有相同类的两种不同类型,其中一种是messagecontract,另一种不是。如果我共享了我的服务契约,那么如何允许客户端和服务器使用相同的RemoteFileInfo?难道服务不想重新实现它吗?我已经编辑了你的标题。请参阅“”,其中的共识是“不,他们不应该”。