我有一个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.RemoteFileInfo
和ServiceReference.RemoteFileInfo
,它们不明确并导致代码丢失大量错误。
我可以通过评论[MessageContract]
行,更新服务引用,然后在启动服务之前取消注释服务端的行,来解决它(sloppily),因此客户端认为它只是一个普通的类,但WCF服务认为它是MessageContract
。这似乎非常愚蠢,我相信这是一个更好的方法。有什么想法吗?
答案 0 :(得分:2)
由于您已经在共享所有数据合同,因此不共享服务合同接口的重点是什么,并且根本就避免执行代码生成?这会更有意义。