在RESTful WCF服务中缓存对象
本文关键字:缓存 对象 服务 RESTful WCF | 更新日期: 2023-09-27 18:10:30
我正在寻找一种使用RESTful WCF服务在内存中缓存对象的方法。该服务是完全无状态的,托管在IIS之外。我想自己实现缓存,所以memcached不是一个选项。
现在我正在考虑托管一个单独的有状态System.ServiceModel.ServiceHost
,它做所有的缓存。它将通过单独的端口或其他方式与WCF方法的其余部分进行通信。然而,我不确定这是否是我问题的理想解决方案。有人有什么建议吗?
我理解您对无状态服务和有状态主机以及两者如何交互的混淆。
在这个代码示例中,我从概念上演示了一个内存中的单例(缓存机制,以后我称之为CachingProvider
)如何被服务类(更准确地说,是请求生命周期中的服务实例)和服务主机(在本例中,我选择它为控制台应用程序)
引用。我在这里假设,服务接口和类都位于托管服务的控制台应用程序项目中。
在这个简单的例子中,我的原语CachingProvider
类基本上充当了一个计数器,表示对GetData方法进行了多少次服务调用,服务主机将每5秒轮询CachingProvider
以获得到目前为止进行的服务调用的计数。
注意:您可以使用WCFTestClient实用程序来快速测试。
免责声明: 我绝不建议像本示例中那样简单地实现复杂的缓存机制,此代码仅用于演示目的。namespace ServiceHostConsole
{
[ServiceContract]
public interface ITestService
{
[OperationContract]
string GetData(int value);
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class TestService : ITestService
{
public TestService()
{
CachingProvider.CallCount++;
}
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
}
//For demonstration purposes only
static class CachingProvider
{
static CachingProvider()
{
//private static constructor can initialize
//static cacheable resources
_callCounter = 0; //Trivial example of initialization
}
private static int _callCounter;
public static int CallCount
{
set { _callCounter = value; }
get { return _callCounter; }
}
}
class Program
{
static void Main()
{
using (var host = new ServiceHost(typeof(TestService), new Uri("http://localhost/TestService")))
{
host.Open();
//Example how the ServiceHost can report on a persistent in-memory object that is being
//updated each time the service is called.
new Timer(state => Console.WriteLine("# of service calls: {0}", CachingProvider.CallCount), null, 0, 5000);
Console.Read();
host.Close();
}
}
}
}