当前位置:编程学习 > C#/ASP.NET >>

问个关于WCF传递泛型集合的问题



我有个泛型集合

[KnownType(typeof(Brand))]
[CollectionDataContract]
[Serializable]
public class PageOfItems<T> : List<T>
{
public PageOfItems()
{ }

}


调用方法是

[OperationContract]
[ServiceKnownType(typeof(Brand))]
PageOfItems<Brand> GetBrands(PagingInfo pagingInfo);


 
在客户端引用这个服务后,返回的对象却是这个

JShop.PageOfItemsOfBrand7rzGfijk

而正确的应该是

JShop.PageOfItems<Brand>

请问这个怎么解决呢?
--------------------编程问答-------------------- WCF啊... 目前没深入了解,飘过  --------------------编程问答-------------------- 没人吗? --------------------编程问答-------------------- 楼主的结贴率。。。 --------------------编程问答-------------------- 谁帮下啊,给份的啊 --------------------编程问答-------------------- JShop.PageOfItemsOfBrand7rzGfijk?
它不会返回不存在的类,你有这样的类吗? --------------------编程问答--------------------
引用 5 楼 qldsrx 的回复:
JShop.PageOfItemsOfBrand7rzGfijk?
它不会返回不存在的类,你有这样的类吗?


没有,这个是引用后,VS自动生成的,但这个是错误的,我想要的是
JShop.PageOfItems<Brand> --------------------编程问答-------------------- [CollectionDataContract]
换成
 [DataContract]
试试


[OperationContract]
[ServiceKnownType(typeof(Brand))]
PageOfItems<Brand> GetBrands(PagingInfo pagingInfo);

去掉
[ServiceKnownType(typeof(Brand))]

契约Contract

[ServiceContract] --------------------编程问答-------------------- 楼上的在胡说八道,什么地方用什么属性都没搞清楚,就在那里瞎指挥,[ServiceContract]只能用在接口或类的属性上,你怎么可以加在函数上

既然楼主说“在客户端引用这个服务后,返回的对象”错误,那么你手动修改下产生的cs文件,将那个对象修改正确试试看,应该可以使用的。我以前也使用引用服务的方法添加过客户端,发现List<T>这类泛型到了客户端,会自动修改接收到的类型的,不再是List<T>对象了,虽然也可以用,但看着不爽我就手动修改了客户端自动产生的CS文件,改回了List<T>对象,使用也没问题。所以你试试手动改下,应该是可以的。
嘛,现在为了稳定和减少麻烦,我单独将公共类放在一个项目中编译为dll同时给WCF服务端和客户端引用,这样就不需要在客户端引用服务了,直接引用dll即可,永远不可能出错。 --------------------编程问答--------------------
引用 8 楼 qldsrx 的回复:
楼上的在胡说八道,什么地方用什么属性都没搞清楚,就在那里瞎指挥,[ServiceContract]只能用在接口或类的属性上,你怎么可以加在函数上

既然楼主说“在客户端引用这个服务后,返回的对象”错误,那么你手动修改下产生的cs文件,将那个对象修改正确试试看,应该可以使用的。我以前也使用引用服务的方法添加过客户端,发现List<T>这类泛型到了客户端,会自动修改接收到的类型的,不再是List……

try --------------------编程问答--------------------
引用 8 楼 qldsrx 的回复:
楼上的在胡说八道,什么地方用什么属性都没搞清楚,就在那里瞎指挥,[ServiceContract]只能用在接口或类的属性上,你怎么可以加在函数上

既然楼主说“在客户端引用这个服务后,返回的对象”错误,那么你手动修改下产生的cs文件,将那个对象修改正确试试看,应该可以使用的。我以前也使用引用服务的方法添加过客户端,发现List<T>这类泛型到了客户端,会自动修改接收到的类型的,不再是List<……

是这样的,要手动修改。
也可以自己写客户端的代码  方法名可以不同只要在服务端和客户端同时定一个相同的name属性
--------------------编程问答--------------------
引用 8 楼 qldsrx 的回复:
楼上的在胡说八道,什么地方用什么属性都没搞清楚,就在那里瞎指挥,[ServiceContract]只能用在接口或类的属性上,你怎么可以加在函数上

既然楼主说“在客户端引用这个服务后,返回的对象”错误,那么你手动修改下产生的cs文件,将那个对象修改正确试试看,应该可以使用的。我以前也使用引用服务的方法添加过客户端,发现List<T>这类泛型到了客户端,会自动修改接收到的类型的,不再是List……


眼睛看清楚咯。。。

契约Contract

[ServiceContract]

契约指的是用接口来定义服务契约(Service Contract)

你哪只眼睛看见我说把ServiceContract加方法上? --------------------编程问答--------------------
引用 8 楼 qldsrx 的回复:
楼上的在胡说八道,什么地方用什么属性都没搞清楚,就在那里瞎指挥,[ServiceContract]只能用在接口或类的属性上,你怎么可以加在函数上

既然楼主说“在客户端引用这个服务后,返回的对象”错误,那么你手动修改下产生的cs文件,将那个对象修改正确试试看,应该可以使用的。我以前也使用引用服务的方法添加过客户端,发现List<T>这类泛型到了客户端,会自动修改接收到的类型的,不再是List……


自动生成的是服务端代理。

我没使用过.NET的服务器引用,一般都是使用Svcutil手动生成代理。服务器端使用List<T>的时候,生成工具会自动转换为 T[] 数组类型。一般手动修改代理就好了。。。  
LZ手动修改代理试试。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,