解决方案将无法构建,因为它无法从服务生成类型转换为我的类型
我有一个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 assemblies
来reuse 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程序集