请问 WCF DataContract 类,其 method 被客户端调用问题

WizardWu 2010-10-31 03:23:40
本帖已曾查了一堆书和资料,如:
http://www.cnblogs.com/frank_xl/archive/2009/04/14/1433712.html
,并曾询问老徐大哥,但仍希望再询问网络上各大高手的意见。

即使最后答案是无解,若各位网友愿提供不错的意见,即使只是一个有参考价值的 URL 或文章,本帖也会给分。

---------------------------------------------------------------------------------

需求 :
WCF Service 的「数据契约(Data Contract)」类,里面又有自定义的「方法」,希望这个方法,也能在网络传中后,能被客户端调用。

---------------------------------------------------------------------------------

起因 :
一位 Design Patterns 走火入魔的狂人,在一个 ASP.NET 小系统里,也搞了几百个自定义类。现在要把这个 ASP.NET App_Code 文件夹里许多里,能发布成 WCF Service。但有一个需求,如下 :


//这是 WCF 服务器端,某个类的代码,返回一个自定义类 TradeTO 的实例,且此 TradeTO 类有属性也有「方法」
public com.公司.vehicle.to.TradeTO calculate (com.公司.vehicle.to.TradeTO tradeTO)
{
com.公司.vehicle.sb.CalculatorSB.calculateMoney (tradeTO);
return tradeTO;
}


TradeTO 类的实例,希望能在 WCF 中被传输。此类已在 Server-side 被标示为 [DataContract],但由于成员标示 [DataMember] 只适用于 Property、Field,不适用于 Method。导致返回 WCF client-side 的 TradeTO 类的实例,在客户端,会调用不到其 方法: Method1(),如下 :


using System.Runtime.Serialization;
using System.ServiceModel;

[DataContract]
public class TradeTO
{
[DataMember]
public string strName = "吴小弟";

[DataMember]
public string StrName { get; set; }

// 这个 Method1 方法,在客户端无法调用 (此为本帖目前的问题所在)
public string Method1()
{
return "this is Method1...";
}
}


我试过其他的做法,例如把 Method1() 标示为 [OperationContract],也把 TradeTO 类标示为 [ServiceContract],并将该类发布为 WCF 服务,如下 :



using System.Runtime.Serialization;
using System.ServiceModel;

[DataContract]
[ServiceContract]
public class TradeTO
{
[DataMember]
public string strName = "吴小弟";

[DataMember]
public string StrName { get; set; }

// 这个 Method1 方法,在客户端无法调用 (此为本帖目前的问题所在)
[OperationContract]
public string Method1()
{
return "this is Method1...";
}
}


虽然编译无误。但结果都一样,无效,客户端就是无法在返回的 TradeTO 里 :
public com.tfmi.vehicle.to.TradeTO calculate (com.tfmi.vehicle.to.TradeTO tradeTO)

找到、调用这个 TradeTO 实例的方法,只能找到它的 Property、Field (标示为 [DataMember] 的成员)

---------------------------------------------------------------------------------

虽然知道这是 .NET WebService、WCF 的默认行为,但仍想请教,有无其他解决方案?或有其他高手有独特的见解。
先谢谢各位。


---------------------------------------------------------------------------------

...全文
399 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
will97 2011-08-22
  • 打赏
  • 举报
回复
学习一下
WizardWu 2010-11-02
  • 打赏
  • 举报
回复
感谢。
这一大堆的类,当初混用了很多种 Desgin Patterns,才会有类包类、自订类的实例相互传来传去。
当时并没有想到,要把他们挂在 IIS 上变成 wcf Server。

TradeTO 在原来本机的站点里,由于是自定义类,是 call by reference,
当作参数被传递时,传的只是内存里的参考。

但若真的当作 WCF Service,传到 WCF Client 的,是不同机器,TradeTO 会变成一个拷贝。


周二今晚结帖。
WizardWu 2010-11-01
  • 打赏
  • 举报
回复
.net web service 试过了,和 wcf 结果一样。
多谢。
danjiewu 2010-11-01
  • 打赏
  • 举报
回复
这不是技术上的问题,是设计上的问题了。
首先明确一点,不同进程间能够互相交互的只有数据,所谓的远程调用都是障眼法而已,基本的步骤都是调用->数据->调用的过程,而TradeTO显然没有实现这一机制,所以不可能调用到服务器端的TradeTO。
从你的帖子看TradeTO是一个实体类,实体类只是数据的载体,不应该附加额外的操作,尤其是依赖自身以外资源的操作。所以如果想要实现你的目的,需要改变你的思路,不是TradeTO去做什么,而是对TradeTO做什么。
IHandler 2010-11-01
  • 打赏
  • 举报
回复
web service
WizardWu 2010-11-01
  • 打赏
  • 举报
回复
push me
WizardWu 2010-10-31
  • 打赏
  • 举报
回复
感谢 sq_zhuyi,
提供另一种思考的方向。

本帖三天内结帖,欢迎其他网友提供各种看法(应无标准解法或官方解法)。
若三天内无其他建议,100 分就都给了 sq_zhuyi。

(积了一堆分数没机会散分)
路人乙e 2010-10-31
  • 打赏
  • 举报
回复
本人有一不是办法的办法,楼主不妨一试:将方法改为属性,如下
public string Method(){
return "test";
}
public string Method{
get{return "test";}
}
可以在GET中作一些复杂运算,当然,你也可以在属性中调用方法
WizardWu 2010-10-31
  • 打赏
  • 举报
回复
有几百个既有的自定义类,都是以前写好的 (j2eer 转 .net 狂人,玩 ooad、设计模式,玩到走火入魔)。

目前希望在不更动既有源代码下,先寻求是否有方式,可直接挂在 IIS 上成为 WCF Service。

62,067

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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