我在类库项目中定义了以下类型。
[CollectionDataContract()]
public class OperationException:System.Collections.Generic.Dictionary<string,ExceptionData>
{
[DataMember()]
public bool ExceptionExists { get; set; }
}
[DataContract()]
public class ExceptionData {[DataMember()] public string Msg;}
在我的WCF服务端,我返回一个包含上述类的对象作为这样的子成员变量。
[DataContract()]
public class SaveClient
{
[DataMember()]
public string Id;
[DataMember()]
public OperationException ExceptionCollection;
}
我在客户端引用了OperationException类库。问题是当我使用Add Service Reference生成代理时,会生成类型字典的OperationException的新定义。我确实将“重用类型”选项设置为true。我喜欢使用实际的'OperationException'类型,因为我必须将此对象传递给其他方法。
先谢谢..!
伊夫蒂哈尔。
答案 0 :(得分:3)
我有同样的问题和你一样,我已经应用了CollectionDataContract属性,并告诉代理生成器重用我的共享程序集中的类型。
修复不明显,您需要在客户端的Reference.svcmap文件中提供一个钩子,告诉生成器使用您的自定义集合类型。
在Reference.svcmap中,按如下所示编辑CollectionMappings元素,然后更新服务引用:
<CollectionMappings>
<CollectionMapping TypeName="YourSharedAssemblyNamespace.OperationException" Category="List" />
</CollectionMappings>
如果您通过提供集合类型参数从命令行使用svcutil,我认为可以实现相同的目标。
/collectionType:YourSharedAssemblyNamespace.OperationException
有关详细信息,请参阅这些帖子:
http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/09eefbbc-bf63-4aa3-a0cb-01a9dbd7f496/
http://www.codeproject.com/KB/WCF/WCFCollectionTypeSharing.aspx
我不确定为什么WCF代理生成器不仅仅使用它的常识来查找共享集合类型,但是你去了,把它当作WCF工具设计中的另一个搞笑。
答案 1 :(得分:1)
您的客户端代理程序集是否具有对添加了类型的类库的项目引用?
如果svcutil生成的代理不是你想要的,那么手工编写代理也很容易。只需创建自己的ClientBase派生类并在其上实现服务接口。然后,您可以控制要重用的程序集类型。