好的,所以你想让你的代码在企业范围内。当你想这样做时,有两个基本问题要讨论,所以我将这样构建答案:
- 您必须了解 WCF 的全部内容。
- 您必须正确管理您的依赖关系。
WCF 是关于什么的
WCF 是一种执行 RPC/RMI(远程过程调用/远程方法调用)的方式,这意味着一些客户端代码可以通过网络调用位于其他地方的代码。
可调用的 WCF 服务由 ABC 三元组确定:
- 服务规范实现为具有“ServiceContract”属性的 .NET 接口。这是合同(“C”)
- 服务的“位置”由一对确定:地址(“A”)和绑定(“B”)。Binding 确定用于客户端和服务器之间通信的协议套件(NetPipe、TCP、HTTP,...)。Address 是遵循由 Binding 确定的方案的 URI ("net.pipe", "net.tcp", "http", ...)
当客户端代码在特定地址调用 WCF 服务时,具有特定的 Binding 和特定的 Contract(必须与特定地址和特定 Binding 的服务器正在交付的内容相匹配),WCF 生成一个代理对象,实现合同。
提供服务的程序是任何 .NET 可执行文件。它必须生成一个或多个 WCF 主机,这些主机将注册实现服务契约的对象或类,并将每个交付的服务与特定的地址和绑定相关联。(可能很多)
可以通过 app .config 文件进行配置,您将在其中指定 ABC 三元组并将这些三元组与您将在应用程序中使用的名称相关联。您也可以以编程方式进行,这非常容易。
WCF 不能解决您部署应用程序或地址和绑定配置的问题。它只是解决了让两个可执行文件与强类型对象(通过特定接口)相互通信的问题。共享服务配置由您决定。您可以在 Windows 共享上使用共享的 .config 文件,甚至设置一个 LDAP 服务器,该服务器将提供查找服务所需的所有数据(即 A 和 B)。
正确管理依赖项
在您的场景中,有三个参与者想要使用您的 WCF 基础结构:
- 您的 SQLCLR 程序集,它将成为客户端。
- Intranet 站点,它将是另一个客户端。
- 服务主机,它将是一个服务器。
最低限度的集会数量为 4 个。每个上述参与者一个,一个指定合同,所有三个参与者都将使用该合同。它应该包含以下内容:
- 指定合约的接口。
- 接口所需的所有类型,当然会通过网络发送,因此必须是可序列化的。
里面不应该有更多的东西,否则,这将是一场维护噩梦。
回答您的问题
我希望我的回答是明确的。让我们总结一下您的问题的答案。
WCF 服务是我想要的解决方案吗?我所有潜在的服务客户端都在同一台服务器上运行,是否有另一种方法可以在 CLR 程序集和网站项目中引用相同的代码库?我不需要对不同平台(例如 Java)的支持——一切都是 .NET(对内部程序来说是的!)——WCF 是否矫枉过正?
一切都是多余的。WCF 相当容易使用并且可以很好地缩减。
WCF 服务中的代码可以像类库一样使用,还是我需要编写一种新的方式来访问服务中的类/方法?
在现有代码上设置 WCF 只需要实现一个附加类,以及一些创建将服务于上述类的主机的代码。
调用 WCF 服务需要创建一个 Channel,它是一个实现接口的 .NET(代理)对象。
所以基本上,您的业务代码保持在相同的状态。
开发、测试和生产实例的分离?
WCF 不会处理这个问题。不同的环境,不同的服务地址。你必须自己解决这个问题。
客户端访问 WCF 服务时是否可以更新它,或者我是否需要安排维护时段?
这取决于您的维护策略。杀死服务进程并启动新版本是基本的升级机制。
当我更新服务时,我是否也需要以某种方式更新客户端?
如果您像我在上一节中概述的那样正确管理您的依赖项,则只有在服务规范(接口)发生更改时才需要更新客户端。
我是否可以动态设置服务引用,就像我目前动态设置数据库连接字符串一样,取决于 StageConfig = dev、test 还是 prod?
您必须管理它,可能通过以编程方式为服务设置地址和绑定。
我的 CLR 程序集是为 .Net 3.5 编写的,但是为 .NET 4.0 编写的网站会造成问题吗?
如果您像我在上一节中概述的那样正确管理您的依赖项,唯一的约束将是“合同”程序集所需的最低 CLR 版本。
我需要知道哪些最少的 .NET 服务架构编程才能完成此任务?随着时间的推移,我将了解更多关于 WCF 的信息,但我需要评估架构工作并将其与完成任务(功能请求)进行权衡。MS 教程能让我获得所需的技能吗?
您将需要这些练习的结果:
- 制作两个可执行文件,一个客户端和一个服务器,它们将通过位于单独 DLL 中的 WCF 合同进行通信。配置应位于 app .config 文件中。
- 制作两个可执行文件,一个客户端和一个服务器,它们将通过位于单独 DLL 中的 WCF 合同进行通信。配置应以编程方式确定。
- 尝试将可序列化的类作为参数发送到您的服务。
- 尝试发送一个可序列化的类作为服务的返回值。
之后,您需要考虑共享服务的地址和绑定的最佳/最便宜的方式。
希望能帮助到你。