本帖已曾查了一堆书和资料,如:
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 的默认行为,但仍想请教,有无其他解决方案?或有其他高手有独特的见解。
先谢谢各位。
---------------------------------------------------------------------------------
其实你没有必要把方法写到TradeTO中,你也知道的 [DataMember] 只适用于 Property、Field,那么你可以把方法定义另外一个类中