2011-01-13 40 views
0

我已经写了一个公开大量方法的WCF服务,它们中的每一个基本都是数据库查询。然而,有多个数据库,所以现在每个方法都有第一个参数是数据库的名称。.NET WCF存储没有持久化或干净实现的会话数据

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

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

我当然可以使用类似的命令模式,并为每次调用创建包含neccessary数据(包括使用继承数据库名)的对象,但这样会导致大量的类(服务器上在客户端)。另一个选择是使用一个字典,但然后我的服务器方法没有指定它的参数,这使得难以维护。我想过使用反射,但这似乎有点矫枉过正...

有什么建议吗?

回答

0

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

0

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

0

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

这样阅读你的服务器代码没有得到污染,可以自动的把和获得的从报头信息到自己的类,以便您的服务实现不知道信息来自哪里。