【问题标题】:Configuring and hosting WCF services in a Prism desktop application [closed]在 Prism 桌面应用程序中配置和托管 WCF 服务 [关闭]
【发布时间】:2012-02-14 22:56:26
【问题描述】:

我的应用程序目前由 2 个不同的解决方案组成。

1) 包含所有 WPF 和前端逻辑的 Shell 2) 包含所有 WCF 服务实现和 NHibernate 相关数据访问的后端。目前,定义了 6 种不同的 WCF 服务合同。

我目前在 Visual Studio 中运行良好,但需要考虑将应用程序安装到用户 PC 时的部署选项。据我所知,在 IIS 中托管 WCF 服务有许多不同的方式——进程内,作为 Windows 服务。我很想知道人们如何在 Prism 应用程序中配置这种类型的设置。

到目前为止我找到的最近的信息来自http://wcfguidanceforwpf.codeplex.com/releases/view/27987,但我认为这不是我想要的。

我想知道:-

a) 如何以及是否可以允许用户为 WCF 服务选择不同的托管策略?
b) 我看到的所有示例都显示了ServiceHost 打开并启动一项服务。这是推荐的做法吗?我必须创建 6 个服务主机,还是可以在一个 ServiceHost 中启动 6 个 WCF 服务?
c) 例如,如果 WCF 服务在进程中运行以进行本地测试- 您是在 Shell 中使用引导程序并打开所有 6 个 WCF 服务,还是在其他地方发生这种情况?
d) 您使用什么策略来配置端点,或者它只是一个修改 app.config 文件的情况?
e)如果有任何不错的在线参考资料或我没有设法找到涵盖 Prism 桌面/WCF 配置的书籍?

抱歉,问题的数量很多,但通常我可以从广泛的谷歌搜索中拼凑出我需要做什么的想法,但在这种情况下,除了上面的链接之外,我找不到任何似乎与我需要知道的内容相匹配的东西。

对于任何问题的任何帮助将不胜感激。

亚历克斯

【问题讨论】:

  • WCF 和 WPF/Prism 是互不影响的互斥框架。此外,您有两种完全不同的产品 - 通过 WCF 部署服务的全部目的是将它们与消费应用程序分开,因此它们托管在 Web 服务器上,供所有桌面应用程序进行通信。总之,你的问题没有意义。

标签: c# wpf wcf hosting prism


【解决方案1】:

首先让我说 Prism 和 WCF 是互斥的框架,使用其中一个并不妨碍以任何方式使用另一个。

a) 为什么要让他们决定如何托管他们的 WCF 服务?最简单的配置是 IIS 托管,它需要最少的设置。一个 IIS Web 可以托管所有六项服务,除非您需要通过将每个服务放在单独的应用程序池中来设置内存屏障。在服务主机中运行服务就等于编写一个 EXE(例如 Windows 服务)来为客户端提供服务。更多的工作和配置(从 Windows 服务端来看,WCF 配置是相同的,除非它通过在 HTTP:80 上运行而与 IIS 冲突)。您有很多方法可供选择,但您使用的是 WCF,所以我假设您有一个客户端/服务器方案。如果您有 Windows 服务器,请使用 IIS,恕我直言。

b) 您可以在同一个服务主机中运行任意数量的 WCF 服务,但如果其中一个服务失败,整个 EXE 就会崩溃。这就是为什么我建议使用 IIS 应用程序池,它会在失败时自动重启,并且可以配置为在不同的应用程序池中运行每个服务。

c) 服务集成代码的放置位置有不同的策略,具体取决于应用程序的结构。我建议为您的每个 WCF 服务编写一个“服务”类,并将每个服务注册到您的容器中,这样您就可以在需要任何特定服务的视图模型上使用 ImportingConstructor。您将在引导加载程序中初始化和注册这些类。此时您可能会问自己是否真的需要 6 个,也许应该考虑合并到 1 个 WCF 服务中。

d) 我不同意塞巴斯蒂安的观点。如果您的服务很简单,那么 WCF 配置就很简单。您需要的越复杂,配置就越复杂。默认情况下,您只需要很少的配置,我会查看 Visual Studio 附带的 WCF 服务配置编辑器工具来修改您的 app.config 和 web.config,但不要混淆您正在处理哪个!配置客户端的最简单方法是使用“添加 Web 引用”并指向服务器计算机上的 URL。请记住,WCF 允许您为同一服务配置多个端点(端点是带有端口和服务名称的 URL),并且每个端点可以具有许多不同的协议之一(我使用 basicHttpBinding、wsHttpBinding 或 netTcpBinding,具体取决于根据我的需要)。我建议从 wsHttpBinding 开始,这是最容易调试的一种。手动修改 app.config 或 web.config 会给你带来麻烦,因为一个错误的输入,你就会调试好几个小时。坚持使用编辑器。

e) 您将找不到关于 Prism 和 WCF 的良好参考,因为其中一个不会影响另一个的实现。通过将您的 WCF 服务代码封装在由容器在 Prism 中提供的服务类中,您可以消除 Prism 本身与服务之间的任何依赖关系,并且以后不会因为无意中将它们耦合在一起而让自己头疼。稍后,您可以使用 Moq 服务类注入视图模型,该服务类不会出于测试目的调用实际服务。 Prism 有一个非常好的 CHM 文件,其中包含您需要了解的有关 Prism 的所有信息,WCF 在 Microsoft 的网站上有很好的文档(不需要书,除非您想花哨,比如使用那个 Windows 服务)。

随时跟进。

跟进#1:

由于我使用 IIS 来托管我的服务,因此我没有经验指导您为多个服务实施 ServiceHost。但是,IIS 允许将多个服务放入同一个应用程序池(这基本上是在您的机器上运行的 W3WP.exe 的单个实例),所以我很确定它可以做到。

编辑:阅读您提供的 WCF 指南后,我可以看到您在 EXE 中为要托管的 每个 服务创建了一个 ServiceHost 实例。所以你需要 6 个 ServiceHost 实例,并在 EXE 代码中分别管理它们。

考虑您的服务是一个设计问题。您选择为每个域类提供一项服务。如果我在我的应用程序中这样做,将会有超过 100 项服务。相反,我选择了一个命令模式来实现一个命令模式,它允许我对我想要的对象发出请求,无论类型如何,它都会在一个干净的界面中将它们返回给我。

我相信您不会在任何书籍中找到有关在 Prism 和 WCF 之间完成设计的指导。您可能会在博客中找到一些内容,但是,我建议您这样做:

将您的 WCF 服务创建和操作封装在一个类(例如 DataAccessService)中,该类可以通过依赖注入注入到您的视图模型中(请参阅 ImportingConstructor 属性)。如果发生错误(或其他可通知事件),请使用 eventtaggregator 服务从 DataAccessService 发布事件,并在视图模型中处理它们。不要通过直接调用它们来在视图模型或视图与 WCF 服务之间创建内聚,因为这将违反 SRP 并阻止在不接触 Web 服务(外部依赖项)的情况下测试视图模型的能力。

【讨论】:

  • 关于 b) 和 c) 我的问题出现了,因为我有一个用于产品的 WCF 服务,一个用于客户,一个用于订单,一个用于地址等。我看不出您如何在1 WCF 服务。此外,我看不到如何在我能看到的所有示例 ServiceHost 代码中运行一个包含 6 个 WCF 服务的服务主机。对于 e) 我正在寻找一些指导,了解如何在使用 MVVM 时使服务调用准备好生产并将错误从 WCF 服务返回给客户端。
  • @lostinwpf 你完全搞糊涂了,我的朋友——你在 WPF 中的应用程序架构(Prism、MVVM 等等)与你的服务的工作方式无关......尝试一次构建一个...... . 在 Web 服务器上构建和部署您的 WCF 服务,针对它和 Fiddler2 运行单元测试。满意时...打开您的 WPF 解决方案并编写其后端以与 WCF 端点对话...您的每个解决方案之间都有一条黑白线
  • @Bahru +1 只是为了解释......
【解决方案2】:

a) 对于“如果”:当然,为什么不呢?对于“如何”:编写将您的服务部署到 IIS 或 Windows 服务或控制台主机的不同模块,并让用户选择运行哪一个。

b) 每个主机一个服务,但可以有多个具有不同绑定的端点。

c) In process 表示它们在您启动应用程序时启动?然后我会选择引导程序。

d) 通过 app.config 配置 WCF 绝非易事。 Visual Studio 中的工具微不足道,旋钮和转盘的数量众多。使用代码进行配置至少可以为您提供 Intellisense 支持。

e) 我不认为这是一个非常常见的组合,所以我不敢打赌那里有任何文献。但是对于有关 WCF 的任何问题,我建议阅读 Juval Lowy 的 Programming WCF Services。我认为代码示例还包含一个用于 WCF 服务的 WinFormsHost,这可能是解决“我在哪里托管服务”问题的另一种选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 2019-12-16
    • 2012-11-29
    • 2017-01-20
    • 1970-01-01
    • 2016-08-14
    • 2012-03-16
    相关资源
    最近更新 更多