silverlight 调用 WCF服务请教

DieMan 2010-04-23 11:03:29
实体
[DataContract]
public class StudentClass
{
[DataMember]
public string Name
....
}
服务A
[ServiceContract]
public class ServiceA
{
public StudentClass GetClass()
{
..
}
}

服务A
[ServiceContract]
public class ServiceB
{
public void SetClass(StudentClass cls)
{
..
}
}

silverlight客户端,服务引用这二个服务。
这时,会生成二个实体代理类(在服务引用的Reference.cs里),但空间不同,如下。
ServiceA.StudentClass
ServiceB.StudentClass

现问题是
无法调用ServiceB时直接传我从ServiceA获取回来的 StudentClass.如。

ServiceA.StudentClass cls = ServiceAClient1.GetClass();
ServiceBClient1.SetClass(cls); // 异常.

// 除非我再new 一个 ServiceB.StudentClass的对象,再赋做操作。

-----------

1.有没有办法让我引用的服务都指向同一个代理实体类,因为项目中有很多类似的情况,不可能每次都做这种类似很“雅观”1的操作。
2. 因项目的需要,不可能把这二个服务合成一个。




...全文
326 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
DieMan 2012-12-17
  • 打赏
  • 举报
回复
to ffff0608: 到目前都没有解决法办
ffff0608 2011-09-23
  • 打赏
  • 举报
回复
楼主,你问题解决没有啊,求分享
songfei5201314 2010-05-02
  • 打赏
  • 举报
回复
有项目管理经验的.NET开发的朋友,可以加上限500人的QQ群28720769,一起交流。
azurechina 2010-04-27
  • 打赏
  • 举报
回复
把所有要重用的契约都放到一个类库中就可以了。我还是不太明白这对KnownType有什么影响。
azurechina 2010-04-27
  • 打赏
  • 举报
回复
你好,

所谓数据契约的意思就是事先的服务器和客户端对数据表示的约定。所以理论上说不应该弄出未知的类型。你的意思是客户端除了已知的KnownType外可能继承数据契约类型并且要在调用WCF时作为参数使用是吗?这样做有什么意义呢? 而且你使用自动生成的代码不是也会有同样问题吗?
  • 打赏
  • 举报
回复
SvcUtil之类的是按照服务的概念设计的,一次针对一个服务生成本地代理,而不是针对整个网站上的所有服务综合起来的。如果要使用这类工具,当然只能按照它的思路。
  • 打赏
  • 举报
回复
显然你们过去误解了什么叫做服务,把本来是一个服务的东西分割成很多服务出来。没有办法,创建新的服务,然后把所有其它方法功能全都在这个新的服务中作委派中转(写一句话调用),客户端只访问这一个新的服务。
jerryfos 2010-04-27
  • 打赏
  • 举报
回复
要达到你的要求的话,就不能在客户端使用自动生成的Reference资源来调用服务接口,要自己编码实现服务接口的调用,在服务端和客户端引用相同的DataContract,这样就才解决,一句话,就是不能用自动生成的客户端代码了。
azurechina 2010-04-26
  • 打赏
  • 举报
回复
你好,

这是一样的啊,为什么加不了?SvcUtil自动生成的代码完全不用也没问题的。他只是帮我们缩短开发时间而已。在类库中不能加上去吗?
DieMan 2010-04-26
  • 打赏
  • 举报
回复
To azurechina
我明白你的意思,在类库中是可以加KnownType的属性,而我的问题是,KnownType有多少个是未知的。
zsuswy 2010-04-23
  • 打赏
  • 举报
回复
合成一个也不是在使用端去合成,
你应该是在服务端去合成啊。
azurechina 2010-04-23
  • 打赏
  • 举报
回复
你好,
在生成代理类窗口中的高级选项里可以设置重用引用配件中的类。通常做法是写一个class library项目把要重用的类放进去,然后在SL项目中引用程序集。在添加服务引用时勾选重用类即可。
DieMan 2010-04-23
  • 打赏
  • 举报
回复
实体
[DataContract]
public class ChildClass : EntityObject
..
[DataContract]
public class ManClass : EntityObject
...
[DataContract]
public class StudentClass : EntityObject
{
[DataMember]
public EntityObject RelationClass {get;set;}
}
服务
public SetClass ( EntityObject entity)
{
...
}
这时,参数EntityObject entity 是未知的,所有要在服务属性中标明有哪些已知类。
所以在客户端的服务引用的代理代码中,对 EntityObject类会加上若干的
[KnownType(StudentClass )]
[KnownType(ManClass )]
...

------------
而如果把上诉的那些类放入一个类库中,那EntityObject的KnownType就不知道要写明哪些了。而服务引用的,系统自动加上去了。
azurechina 2010-04-23
  • 打赏
  • 举报
回复
补充一下,我指的是DataContract这个attribute上设置的name和namespace
azurechina 2010-04-23
  • 打赏
  • 举报
回复
你好,
我没有具体试过,但是理论上服务器端不是看类的名字而是看soap消息内的namespace和name来反序列化的。所以客户端设置跟服务器端相同的namespace和name理论上应该没有问题。如果这会造成KnownType使用的时候报错我倾向于认为这是个WCF的bug。你可以试一下,如果确实不行我们再讨论。
DieMan 2010-04-23
  • 打赏
  • 举报
回复
引用 azurechina :
你好,
在生成代理类窗口中的高级选项里可以设置重用引用配件中的类。通常做法是写一个class library项目把要重用的类放进去,然后在SL项目中引用程序集。在添加服务引用时勾选重用类即可。

---------------------------
虽然这样可以避免服务引用时,生成相同的类,但是,我最担心的是类的属性KnownTypeAttribute的声明。
[DataContract]
public class StudentClass : EntityObject
{
[DataMember]
public string Name
....
}
public class A : EntityObject
....
在客户端服务引用时都会生成
[KnownType(StudentClass )]
....
public class EntityObject
...
之类的东西。
如果统一引用这个类库。那KnowType的属性怎么办,不声明这个属性,运行时没提交到服务端就报错了。
我这边有几项目组,他们都提供WCF服务,有些实体就是同一个的。但服务之间不能共享。

13,347

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET技术前瞻
社区管理员
  • .NET技术前瞻社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧