通过消息协定重用类型
本文关键字:类型 消息 | 更新日期: 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.RemoteFileInfo
和 ServiceReference.RemoteFileInfo
,这是模棱两可的,并导致代码抛出大量错误。
我可以通过注释掉[MessageContract]
行,更新服务引用,然后在启动服务之前取消服务端的行来绕过它(草率),因此客户端认为它只是一个普通类,但 WCF 服务认为这是一个MessageContract
。这似乎非常愚蠢,我相信有更好的方法可以做到这一点。有什么想法吗?
既然你已经共享了所有的数据协定,那么不共享你的服务协定接口,干脆避免做代码生成有什么意义呢?这将更有意义。