在WCF服务中使用ASMX Web服务实体

本文关键字:服务 ASMX Web 实体 WCF | 更新日期: 2023-09-27 18:09:46

我们有一个很好的旧.asmx web服务(让我们称之为"Message" 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...
    }
}

这个DLL也被一个全新的WCF服务使用。现在,我必须从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是完全相同的实体!这真的不可能吗?

在WCF服务中使用ASMX Web服务实体

很抱歉,但我想我有坏消息。您可以尝试使用xml序列化而不是数据契约序列化,因为asmx不知道它。

同样,这篇文章说这是可能的,但不是那么容易:.NET 3.5 ASMX Web服务-通过。net 3.5服务引用调用-公共类重用

也许你会发现添加你的translator类更容易。