1

我们有一个很好的旧 .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 是完全相同的实体!这真的不可能吗?

4

1 回答 1

1

对不起,但我想我有坏消息。您可以尝试使用 xml 序列化而不是数据协定序列化,因为 asmx 不知道它。

此外,这篇文章说这可能但并不那么容易:.NET 3.5 ASMX Web Service - Invoked via .NET 3.5 Service Reference - Common Class Reuse

可能您会发现添加翻译类更容易。

于 2013-04-17T17:57:35.100 回答