我有一个构建良好的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< Thing>' to'(...)。myCollectionOfThing0mj5ZrAW'
我的收藏课程按您的要求进行装饰:
[CollectionDataContract]
public class MyCollection<T> : List<T> where T : BaseType
{
// ...
}
我不知道为什么它会产生时髦的&#34; myCollectionOfThing0mj5ZrAW&#34;名称,或者为什么从一个到另一个的翻译失败
编辑1: 我尝试过使用
[CollectionDataContract(Name= "myCollection{0}", ItemName = "{0}")]
来装饰我的集合类,我得到了相同的错误,但更新了名称:
错误12参数1:无法转换为&#39;(...)。myCollection&lt;(...)。事情&gt;&#39; 到&#39;(...)。myCollectionThing&#39;
编辑2:
尽管检查了引用程序集中的&#34;重用类型&#34;,但选择了#34;指定引用程序集&#34;的单选按钮,并选中我的POCO程序集旁边的框:
...服务引用是使用唯一类名生成的STILL:
答案 0 :(得分:1)
正如@vesan&amp; amp; @RitchMelton在评论中,似乎类型在客户端重新生成,您应该重用 DataContract
。
如果要添加服务引用,请通过选择radio reuse types in all references assemblies
重用引用的程序集中的类型:
另请注意,您可能需要将集合类型更改为System.Collection.Generic.List
,以防止将列表更改为数组/
如果使用SvcUtil生成代理,则需要使用/reference:
重用DataContract
程序集,同时生成以下参考:
svcutil /reference:YourDLL.dll http://localhost/YourService?wsdl
有关/refernce
与SvcUtil
的详细信息,请参阅: