【问题标题】:.NET WCF store session data without persistence or clean implementation.NET WCF 存储会话数据,无需持久性或干净的实现
【发布时间】:2016-01-16 05:47:47
【问题描述】:

我编写了一个 WCF 服务,它公开了大量的方法,每个方法基本上都是一个数据库查询。然而有多个数据库,所以现在每个方法都有一个第一个参数是数据库的名称。

在客户端,一个会话只使用一个数据库,所以我不想每次调用服务时都传递数据库的名称。理想情况下,我想首先将数据库名称发送到服务,该服务将其存储在内存中以供将来所有查询使用。问题是我的客户端是用经典的 ASP 编写的,因此我使用的是 basicHttpBinding,因此服务器上的调用之间没有持久性。

我现在的问题是,是否有另一种方法,如果没有,我将如何很好地实现它,所以我在每个方法签名中都没有数据库名称。

我当然可以使用命令模式之类的东西,并为每次调用创建一个包含必要数据的对象(包括使用继承的数据库名称),但这会导致很多类(在服务器上 在客户端)。另一种选择是使用字典,但是我的服务器方法没有指定它的参数,这使得它更难维护。我曾考虑过使用反射,但这对我来说似乎有点矫枉过正......

有什么建议吗?

【问题讨论】:

    标签: .net wcf session persistence


    【解决方案1】:

    我不知道任何针对此的 WCF 特定解决方案。但是您始终可以通过创建一个方法来解决这个问题,该方法在第一个请求中存储客户端标识和所需的数据库,以便后续请求可以查询该存储。

    【讨论】:

      【解决方案2】:

      您可以尝试使用this sample 来构建基于cookie 的会话——ASMX 也支持同样的方法。您的服务将能够访问 ASP.NET 会话,但它需要 AspNetCompatibility。您也可以尝试将其与自定义IInstanceProvider结合起来,构建由cookie控制的自定义会话管理。

      【讨论】:

        【解决方案3】:

        您可以依赖this answer,它是关于启用类似 ASP.NET 的会话。

        【讨论】:

          【解决方案4】:

          如果所需的客户端运行 ASP,我可能会选择建议的 AspNetSession 解决方案。但是,如果您不能依赖 AspNetSessions,那么您可以依赖使用 HTTP-Headers 在每次调用时发送该信息。在第一次调用时,定义数据库时,服务器会直接从方法参数中获取有关要获取哪个数据库的信息,并将其存储到 HTTP 标头中。

          OperationContext.Current.OutgoingMessageHeaders.Add(MessageHeader.CreateHeader(HEADER_NAME, NAMESPACE, yourDbName));
          

          在经典的 ASP 中必须有一种方法来检索该信息,但我不是这方面的专家。

          http://www.w3schools.com/asp/coll_servervariables.asp

          表示您可以访问它。在所有后续调用中,客户端再次将该标头信息发送到服务器。

          在您阅读它的服务器上

          int index = OperationContext.Current.IncomingMessageHeaders.FindHeader(HEADER_NAME, NAMESPACE)
          string yourDbName = OperationContext.Current.IncomingMessageHeaders.GetHeader<string>(headerIndex);
          

          通过这种方式,您的服务器代码不会受到污染,并且您可以自动将该信息从标头放入和获取到自己的类中,这样您的服务实现就不会知道该信息来自何处。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-04-07
            • 2010-10-16
            • 1970-01-01
            • 2010-09-16
            • 1970-01-01
            • 2011-02-28
            • 2012-06-15
            • 2020-10-01
            相关资源
            最近更新 更多