从现有ASP.NET应用程序创建/公开WCF服务

从现有ASP.NET应用程序创建/公开WCF服务,asp.net,wcf,visual-studio-2010,interop,soa,Asp.net,Wcf,Visual Studio 2010,Interop,Soa,我们需要将当前驻留在ASP.NET应用程序中的某些服务(即AddressValidatorService、CustomerFinderService)公开给组织内的其他应用程序。通过WCF公开这些服务似乎是一种自然的选择,但我看不到任何最佳实践,即如何将这些公共服务拉入WCF包装器,使我现有的ASP.NET应用程序能够在代码更改最少的情况下继续使用它们,和/或意识到它们正在使用的服务不再是进程中的服务 我特别想了解有关如何构建现有ASP.NET解决方案的建议,以及是在同一解决方案中托管新的WCF

我们需要将当前驻留在ASP.NET应用程序中的某些服务(即AddressValidatorService、CustomerFinderService)公开给组织内的其他应用程序。通过WCF公开这些服务似乎是一种自然的选择,但我看不到任何最佳实践,即如何将这些公共服务拉入WCF包装器,使我现有的ASP.NET应用程序能够在代码更改最少的情况下继续使用它们,和/或意识到它们正在使用的服务不再是进程中的服务

我特别想了解有关如何构建现有ASP.NET解决方案的建议,以及是在同一解决方案中托管新的WCF,还是在ASP.NET应用程序和外部调用方引用的某个新的共享WCF解决方案中托管新的WCF


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

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

例如:

MyClass obj = new MyClass();
obj.DoSomething(withData);
将成为:

MyClassClient obj = new MyClassClient();
obj.DoSomething(withData);
您可以将WCF项目发布到某个端点,如
address.example.com
,然后在其他项目中使用对该端点的服务引用来引用代码,如项目引用


请注意,虽然外部引用的项目不会受到更改的影响,也不会知道数据正在通过网络传输,但如果您对所讨论的项目有闲聊电话,它肯定会受到性能的影响。您可能希望将相关方法合并为单个方法,以便在往返时保存。

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

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

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


要回答第二个问题:

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

将您的业务模型公开为WCF合同被认为是一种不好的做法。因此,如果您的DTO是您的域模型的副本,那么这将是一个严格的否,因为
1.模型的任何更改都将直接影响合同,从而影响所有使用该模型的客户
2.你将向外界展示你的业务“诀窍”

对于任何不断发展的系统来说,后者可能会变得困难,但是您有各种各样的开源工具(如AutoMapper)来简化您的映射nighmares