【问题标题】:Designing a WCF Service properly正确设计 WCF 服务
【发布时间】:2015-06-02 18:17:58
【问题描述】:

我需要在工作中创建一个 WCF 服务,该服务将处理来自同一台机器上不同客户端的请求,以及来自不同机器但在公司网络上的客户端的请求(来自程序员计算机 - 用于调试目的)。 我需要一些关于如何创建服务的建议,因为我是 WCF 的初学者。

该服务将从客户端获取请求以在主机上的硬件设备上执行不同的操作。 该服务需要包含几个模块来支持各种硬件设备。 编写客户端代码的程序员将使用这些模块对象来执行操作。 每个模块都需要支持面向客户端的事件和异常抛出。

我想知道几件事:

  1. 是否可以以某种方式将方法文档导出到 客户?因为最好,当客户端代码正在 写出来,程序员就能看清楚具体是什么方法了 确实,抛出了什么异常等等。我看到有一个 将 API dll 共享给客户端的方式(请记住,大多数 客户端将使用 .NET 在同一台机器上运行(和编码)。
  2. 是否可以只在服务中抛出异常 实现方法?我会想要使用大部分 .NET 功能 例外就是其中之一:)
  3. 该服务将在每个线程中处理来自不同线程的请求 客户端,是否可以使用线程信息(如线程 Id)或任何其他方式以执行锁定机制?为了 例如,如果同一客户端的两个线程使用相同的硬件 设备通道第二个将被阻塞,直到第一个 完成了。
  4. 最后,我想知道什么是最好的端点和 此服务的配置?

我知道这很多,但我阅读了基础知识,但我无法确定满足这些要求的正确方法。

提前致谢。

【问题讨论】:

  • 我建议研究使用 IErrorHandler 对服务进行全局异常处理。

标签: c# .net wcf


【解决方案1】:

1 - 是的。正如您所说,您可以共享 API dll,还可以使用 Mex 端点来提供有关您的服务的文档:https://social.msdn.microsoft.com/Forums/vstudio/en-US/3def9d4f-ae3e-468b-90e6-3a069bac6376/when-to-use-wcf-mex-endpoint

2 - 是的。 WCF 抛出 FaultException 并将其发送给客户端,只要出现问题并且没有被自己的应用程序捕获。

3 - 客户端在他们自己的线程或线程池中运行(我不记得确切,但无论如何这都不重要)。您仍然可以毫无问题地为客户端使用多线程功能。 WCF 本身是线程安全的,客户端明智的。它基本上抽象了所有内容,以使其看起来像是为每个用户运行一个完整的专用应用程序。

4 - 此应用程序是web 还是桌面?如果您使用 web,我建议使用 nethttpbinding 以确保可靠性。如果您使用 desktop,则使用 nettcpbinding 可以获得更好的性能结果。

【讨论】:

  • 第 2 点的一个重要说明。如果您允许任何类型的异常不是FaultExceptionFaultException<T>,其中T 在@ 987654328@在向客户端冒泡的界面上,客户端与服务器的连接将自动关闭并设置为faulted状态。允许引发 FaultException 不会关闭连接。
  • 第三点默认情况下是完全正确的,但是更改服务行为的 InstanceContextMode 和 ConcurrencyMode 可能会导致一些问题。但这一切都取决于正在构建什么样的 WCF 服务。
  • 4 - 基于意见,您没有提供任何论据来支持您的意见。
  • 第 4 点 - 我不会为此使用 rest 端点 - OP 正在寻找 RPC 样式的操作,因此 netTcpBinding 肯定会提供最高效的方法,因为它只是原始套接字通信。
  • 感谢您的回答和澄清。那么什么 InstanceContextMode 和 Concurrency Mode 最适合我呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多