2011-01-20 72 views
4

有一个winform应用程序,并希望在其中托管一个WCF服务。我需要将其托管在单独的应用程序域中吗?任何建议?托管WCF服务的任何建议?

+0

我很想知道您为什么在您的服务中托管您的服务一个Windows窗体应用程序。如果不是主持一场比赛会更好。 Windows服务b。 IIS(如果这是一个选项),而不是? – InSane 2011-01-20 03:30:07

回答

4

您不需要将其托管在单独的域中,但您必须决定是否希望服务请求由UI线程或其他线程处理。这取决于您创建ServiceHost实例的方式或应用于您的服务类的ServiceBehavior

当服务在UI线程中托管时,它可以直接与UI交互,但请求处理是消息循环的一部分,所有服务请求都由单个线程(按顺序)处理。处理请求时,不能处理其他窗口事件(包括UI事件)=应用程序冻结。

当服务驻留在不同的线程中时,它的行为与其他宿主环境中的行为相同,但不能直接与UI交互 - 您必须使用委托调用。

方法来执行服务于自己的线程中运行:

  • 创建和打开ServiceHost实例调用Application.Run(的Windows消息循环的开始)
  • 以前创建并在单独的线程
  • 开放ServiceHost实例在您的服务实施上使用[ServiceBehavior(UseSynchronizationContext = false)]
1

不,您不必将其托管在单独的AppDomain中。只需托管它。 WinForms在这方面没有什么特别的特殊之处。

0

你的应用做什么?服务是应用程序常规功能的一部分还是完全独立的逻辑实体?

如果您想要加载和卸载与您的服务相关的资源(例如程序集)而不关闭您的应用程序而不关闭您的应用程序将会使这更容易,但否则我不会看到很多复杂的原因的东西。

只是我的2C。 :-)

0

您可以以Win形式托管,但必须始终保持运行。

还建议您在IIS中托管,以便任何类型的客户端可用您的服务。