代码之家  ›  专栏  ›  技术社区  ›  Sudheer Kumar

WCF设计问题

wcf
  •  1
  • Sudheer Kumar  · 技术社区  · 14 年前

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

    1。wcf服务设计问题。

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

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

    2。我应该使用sessionmode吗? 对于我的契约,我使用了:[service contract(sessionmode=sessionmode.required)]并且没有这个服务属性。

    不管我做什么选择,我总是为:system.servicemodel.operationcontext.current.sessionid找到一个值 这怎么解释?

    当我说sessionmode.required时,instanceContextMode是否自动更改为persession?

    三.要使用InstanceContextMode? 我的服务是无状态的,只是我在通道上下文中存储了一些值,如(1)所述。 我应该使用percall还是persession作为instanceContextMode?

    2 回复  |  直到 14 年前
        1
  •  1
  •   marc_s Anurag    14 年前

    nettcp总是有一个传输级别的会话在运行-所以这就是为什么您总是有一个sessionid。所以基本上,不管您选择什么,使用nettcp,您都可以从传输层上获得会话连接。

    至于instanceContextMode——只要你不需要会话中的任何东西,除了sessionID——没有可靠的消息等——然后我通常会选择每个调用——它更具可伸缩性,通常性能更好,它给你更少的“黏合剂”和你需要的比特和碎片管理。

    只有在需要打开可靠的消息传递或其他绝对需要wcf会话的情况下,我才会使用显式必需的会话。如果你没有-那么在我看来这只是不必要的开销。

        2
  •  1
  •   Petar Kabashki    14 年前

    将sessionmode设置为sessionmode.required将强制使用支持会话的绑定,如nettcpbinding、wshttpbinding等。事实上,如果尝试使用非启用会话的绑定,运行库将在尝试打开主机时引发异常。

    将instanceContextMode设置为per session意味着每个会话将只装入服务的一个实例,并且该实例将服务于来自该会话的所有请求。

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

    将instanceContextMode和session模式配置的应用程序会话视为更高级别的会话,依赖于较低级别的会话/安全性、传输或可靠性/。如果没有其他会话中的一个,则实际上无法建立应用程序会话,因此需要绑定。

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