WCF设计问题

时间:2010-02-07 21:55:59

标签: wcf

我正在设计一个WCF服务。 我正在使用netTCP绑定。 可以从多线程客户端调用该服务。 多线程客户端不共享代理。

1。 WCF服务设计问题。

客户端必须在每次调用中发送这两个值:UserID和SourceSystemID。这将有助于服务识别用户及其所属的系统。 我没有在每次调用中传递这两个值,而是决定在客户端调用期间将它们与服务一起缓存。 我决定为Service提供一个参数化构造函数,并将这些值存储在ChannelContext中,如本文所述。 http://www.danrigsby.com/blog/index.php/2008/09/21/using-icontextchannel-extensions-to-store-custom-data/

最初我想将值存储在Session中,并有一个初始化和终止方法。但在那里我发现我需要在每种情况下手动清理会话。当我在通道上下文中存储值时,我不必每次都清理它,当通道关闭时,存储的值已被销毁。 有人可以确保我的假设是正确的吗?

2。我应该使用SessionMode吗? 对于我的合同,我使用了:[ServiceContract(SessionMode = SessionMode.Required)]并且没有这个服务属性。

无论我选择什么,我总是找到一个值:System.ServiceModel.OperationContext.Current.SessionId 怎么解释这个?

当我说SessionMode.Required时,我的InstanceContextMode会自动更改为PerSession吗?

第3。要使用的InstanceContextMode? 我的服务是无状态的,除了我在通道上下文中存储一些值,如(1)中所述。 我应该使用Percall还是PerSession作为InstanceContextMode?

2 个答案:

答案 0 :(得分:1)

netTcp总是有一个传输级会话 - 这就是为什么你总是有一个SessionId。所以基本上,无论您选择什么,使用netTcp,您都可以从传输级别开始实现会话连接。

至于InstanceContextMode - 只要你不需要会话以外的任何其他会话 - 除了SessionId - 没有可靠的消息传递等 - 然后我通常选择Per-Call--它更具可扩展性,它通常表现更好,它为您提供更少的“胶水”以及您需要管理的更少的零碎。

只有当您需要打开可靠的消息或其他绝对需要WCF会话的内容时,我才会使用明确要求的会话。如果你不这样做 - 那么在我看来,这只是不必要的开销。

答案 1 :(得分:1)

将SessionMode设置为SessionMode.Required将强制使用支持会话的绑定,如NetTcpBinding,WSHttpBinding等。实际上,如果您尝试使用非会话启用的绑定,则当您尝试打开时,运行时将引发异常主机。

将InstanceContextMode设置为PerSession意味着每个会话只会创建一个服务实例,该实例将提供来自该会话的所有请求。

运行时设置SessionId意味着您可能具有传输会话或可靠会话或安全会话。拥有这些并不一定意味着您有一个应用程序会话,这是一个服务于每个代理请求的服务对象。换句话说,您可以通过设置InstanceContextMode = PerCall强制为每个调用创建新服务对象来关闭应用程序会话,同时由于使用netTcpBinding或可靠或安全会话而维护传输会话。

将InstanceContextMode和会话模式配置的应用程序会话视为更高级别的会话,依赖于较低级别的会话/安全性,传输或可靠/。如果没有其他会话就位,那么实际上就无法建立应用程序会话,从而需要绑定。

它已经有点长了,但对于简单的值,我建议你每次传递这些值而不是创建应用程序会话。这将确保服务对象的生命周期短,并且服务器上不会保留不必要的资源。对于更多客户或代理与您的服务交谈,这很有意义。您可以随时缓存客户端中的值,如果需要,甚至可以将它们作为自定义标头传递。