解决方案将无法构建,因为它无法从服务生成类型转换为我的类型

我有一个WCF服务项目,可以很好地构建,生成一个可访问的WSDL,并且svcutil.exe不会产生任何错误。

我有一个“服务管理器”项目访问该Web服务,并且我已成功添加了服务参考ABCService。

第三个项目包含我需要来回传递的所有POCO对象 – 使用[DataContract]和[DataMember]属性进行大量装饰。

当我尝试构建解决方案时,我看到ABCService的Reference.cs有这样的方法( 为了简洁,我已经用完全命名空间代替(…) ):

public (...).Thing SaveThing((...).Thing objThing) { return base.Channel.SaveThing(objThing); } public (...).myCollectionOfThing0mj5ZrAW GetThings() { return base.Channel.GetThings(); } 

第一个返回单个Thing的方法工作正常 – 但是每个MyCollection方法都会出错:

错误16参数1:无法从’(…)。MyCollection ‘转换为’(…)。myCollectionOfThing0mj5ZrAW’

我的集合类按照您的期望进行装饰:

 [CollectionDataContract] public class MyCollection : List where T : BaseType { // ... } 

我不知道为什么它会生成时髦的“myCollectionOfThing0mj5ZrAW”名称,或者为什么从一个到另一个的转换失败

编辑1:我尝试过使用

 [CollectionDataContract(Name= "myCollection{0}", ItemName = "{0}")] 

装饰我的集合类,我得到相同的错误,但更新的名称:

错误12参数1:无法从’(…)。myCollection ‘转换为’(…)。myCollectionThing’

编辑2:

尽管检查了“引用程序集中的重用类型”,但选中了“指定引用程序集”的单选按钮,并选中了我的POCO程序集旁边的框: 重用引用的程序集的屏幕截图

…服务引用是使用唯一类名生成的STILL:

在此处输入图像描述

正如@vesan和@RitchMelton在评论中所建议的那样,似乎在客户端重新生成类型,您应该重用 DataContract

如果要添加服务引用,请通过reuse types in all references assemblies选择无线reuse types in all references assembliesreuse types in all references assemblies在此处输入图像描述

另请注意,您可能需要将集合类型更改为System.Collection.Generic.List以防止将List更改为Arrays /

如果使用SvcUtil生成代理,则需要使用/reference:重用DataContract程序集,同时生成以下参考:

 svcutil /reference:YourDLL.dll http://localhost/YourService?wsdl 

有关SvcUtil /refernce更多详细信息,请参阅:

ServiceModel元数据实用工具(Svcutil.exe)

svcutil exlude / reuse refrenced程序集