【问题标题】:Creating/Exposing WCF services from an existing ASP.NET application从现有 ASP.NET 应用程序创建/公开 WCF 服务
【发布时间】:2023-11-18 08:43:01
【问题描述】:

我们需要将当前驻留在 ASP.NET 应用程序中的一些服务(即 AddressValidatorService、CustomerFinderService)暴露给我们组织内的其他应用程序。通过 WCF 公开这些服务似乎很自然,但我没有看到任何最佳实践来说明如何将这些公共服务拉入 WCF 包装器,以使我现有的 ASP.NET 应用程序可以以最少的方式继续使用它们代码更改和/或意识到他们正在使用的服务不再进行中。

我特别在寻找有关如何构建现有 ASP.NET 解决方案以及是否在同一解决方案中托管我们的新 WCF 或在我们的 ASP.NET 应用程序和外部调用者引用的一些新共享 WCF 解决方案中的建议。

此外,将当前仅通过 ASP.NET 在进程内使用的 DTO 简单地提升为完整的数据合同是不好的做法,还是最好创建用 [DataContract] 显式修饰的重复 DTO?后者似乎是一场维护噩梦。

【问题讨论】:

    标签: asp.net wcf visual-studio-2010 interop soa


    【解决方案1】:

    回答你的第二个问题:

    此外,将当前仅通过 ASP.NET 在进程内使用的 DTO 简单地提升为完整的数据合同是不好的做法,还是最好创建用 [DataContract] 显式修饰的重复 DTO?后者似乎是一场维护噩梦。

    将您的业务模型公开为 WCF 合同被认为是一种不好的做法。因此,如果您的 DTO 是您的域模型的副本,那么这将是一个严格的禁忌,因为
    1. 模型的任何变化都会直接影响合同,从而影响所有使用它的客户
    2. 您会将您的业务“专有技术”暴露给外界。

    对于任何不断发展的系统来说,后者往往会变得很困难,但是您可以使用各种开源工具(例如 AutoMapper)来缓解您的映射问题。

    【讨论】:

      【解决方案2】:

      您可以将现有项目转换为 WCF,然后通过使用项目引用继续在进程中使用它。然后它可以由使用 WCF 客户端的永久源使用。 WCF 客户端在通过 WCF 使用时将类名从 ClassName 转换为 ClassNameClient,但该类的功能几乎相同。

      例如:

      MyClass obj = new MyClass();
      obj.DoSomething(withData);
      

      会变成:

      MyClassClient obj = new MyClassClient();
      obj.DoSomething(withData);
      

      您可以将 WCF 项目发布到某个端点,例如 address.example.com,然后使用对端点的服务引用来引用其他项目中的代码,就像项目引用一样。

      请注意,虽然外部引用项目不会受到更改的影响或知道数据正在通过网络传输,但如果您对相关项目进行闲聊,它肯定会对性能造成影响。您可能希望将相关方法合并到单个方法中以节省往返时间。

      【讨论】:

        【解决方案3】:

        如果这些作为静态页面服务公开,则没有神奇的包装器——您需要将代码移动到独立的服务实现类并在其前面放置一个 .svc 文件。 (或者使用 WCF4 无文件激活,或者服务工厂,但这有点偏离这里的核心问题。)

        如果这些被公开为 ASMX,您实际上可以在 WCF 服务类前面放置一个 ASMX 外观,并获得基本的 HTTP/XML/ASMX 响应,就像从旧的 ASMX Web 服务中一样。您可以通过标准 WCF 配置为非传统消费者公开相同的 WCF 服务类。

        最后,您可以使用 serviceMetadata + httpGetEnabled 将任何 WCF 服务公开为 basicHTTP,并且您将获得一个可供 ASMX 服务的旧消费者使用的服务端点。

        http://msdn.microsoft.com/en-us/library/ms751433.aspx

        【讨论】:

          最近更新 更多