我正在考虑自行托管我的 WCF 服务,而不是使用 IIS。对我来说,一个大问题是我是否需要像 IIS 那样实例化多个服务主机,或者一个就足够了。
除了隔离的安全原因之外,多个服务主机是否有任何好处?
一个服务主机可以同时在一个端点上服务多个连接吗?
我正在考虑自行托管我的 WCF 服务,而不是使用 IIS。对我来说,一个大问题是我是否需要像 IIS 那样实例化多个服务主机,或者一个就足够了。
除了隔离的安全原因之外,多个服务主机是否有任何好处?
一个服务主机可以同时在一个端点上服务多个连接吗?
没有好处或选择,真的 - 一个ServiceHost
(该类的实例)可以只托管一个服务,并且对于每个服务,您需要一个单独的服务主机。这是一个 1:1 的映射 - 总是,别无选择。
但当然,您的 Windows NT 服务或控制台应用程序可以ServiceHost
同时激活多个对象。如果您有一组在逻辑上属于一起并且没有彼此就不能真正存在的服务,这将很有用——其中一个启动而另一个不启动是没有意义的。
是的,一个服务主机可以托管一个暴露多个端点的服务,并且多个客户端可以同时连接这些单独的端点,没问题。WCF 运行时将启动多个工作线程以独立处理传入请求(您可以使用 ServiceThrottling 行为限制这些请求)。
要设置和控制您有多少并发调用和请求,您需要查看服务器端的 ServiceThrottling 行为。
<behaviors>
<serviceBehaviors>
<behavior name="serviceThrottled">
<serviceThrottling
maxConcurrentCalls="16"
maxConcurrentInstances="26"
maxConcurrentSessions="10"/>
</behavior>
</serviceBehaviors>
</behaviors>
当然,您需要在服务声明中引用该服务行为配置:
<service name="YourService" behaviorConfiguration="serviceThrottled">
.....
</service>
这些是默认值。解释如下(摘自 Dan Rigsby 的博文,已缩短):
MaxConcurrentCalls (default = 16) [Per-message] 可以主动处理的最大消息数。
MaxConcurrentInstances(默认值 = 26)服务中一次可以执行的最大 InstanceContext 对象数。对于 per-session 服务,这等于最大会话数,对于 per-call 服务,它是最大并发调用数,对于单例,它是没有意义的。
MaxConcurrentSessions (default = 10) [Per-channel] 服务一次可以接受的最大会话数。仅对基于会话的绑定(wsHttp 或 netTcp)起作用
当然还可以查看Dan Rigsby关于该主题的出色博客文章。