通过消息协定重用类型

本文关键字:类型 消息 | 更新日期: 2023-09-27 18:35:10

我有一个 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]行,更新服务引用,然后在启动服务之前取消服务端的行来绕过它(草率),因此客户端认为它只是一个普通类,但 WCF 服务认为这是一个MessageContract。这似乎非常愚蠢,我相信有更好的方法可以做到这一点。有什么想法吗?

通过消息协定重用类型

既然你已经共享了所有的数据协定,那么不共享你的服务协定接口,干脆避免做代码生成有什么意义呢?这将更有意义。