我们有一个很好的旧 .asmx Web 服务(我们称之为“消息”Web 服务),我们必须保留它以实现向后兼容性。.asmx 服务公开了这个方法:
[WebMethod(Description = "Do Something")]
public int DoSomething(Entity1 e)
{
...
}
此 Web 服务使用一些从 DLL 引用的实体,例如:
namespace Software.Project.Entities
{
[DataContract]
public class Entity1
{
[DataMember]
public string property1{ get; set; }
// Lots of other properties...
}
}
全新的 WCF 服务也使用此 DLL。现在,我必须从 WCF 调用旧的 .asmx 方法。为此,在 WCF 项目中,我使用“添加服务引用”向导(高级 - 添加 Web 引用)添加了对 .asmx 项目的引用。
现在,太好了!我可以通过这种方式从 WCF 调用 DoSomething 方法:
Entity1 e1 = new Entity1();
Software.Project.WCFService.ServiceReferenceName.Message m = new Software.Project.WCFService.ServiceReferenceName.Message();
m.Url = ConfigurationManager.AppSettings["MessageWebServiceURL"];
int r = m.DoSomething(e1);
不幸的是,这样做是行不通的:我得到一个编译器错误,比如 WCF 中的 Entity1 不能作为方法 DoSomething 的参数。我要做的是:
Entity1 e2 = new Software.Project.WCFService.ServiceReferenceName.Entity1();
Software.Project.WCFService.ServiceReferenceName.Message m = new Software.Project.WCFService.ServiceReferenceName.Message();
m.Url = ConfigurationManager.AppSettings["MessageWebServiceURL"];
int r = m.DoSomething(e2);
通过这样做,编译器接受调用;问题是我的 WCF 服务中的 Entity1 充满了字段和数据,我必须将所有数据复制到新实体。
我还尝试将 .asmx 的引用添加为服务引用,并标记“在引用程序集中重用类型”,但结果完全相同。
我不敢相信没有办法让它理解 Entity1 是完全相同的实体!这真的不可能吗?