自定义集合类型未在WCF客户端代理端问题上重用

时间:2011-11-05 12:58:54

标签: wcf

我在类库项目中定义了以下类型。

[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'类型,因为我必须将此对象传递给其他方法。

先谢谢..!

伊夫蒂哈尔。

2 个答案:

答案 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派生类并在其上实现服务接口。然后,您可以控制要重用的程序集类型。