我有一个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。这似乎很愚蠢,我相信有更好的方法可以做到。有任何想法吗?

最佳答案

由于您已经共享了所有数据合同,因此不共享服务合同接口又有什么用呢?那会更有意义。

10-03 00:23