【问题标题】:Caching objects in a RESTful WCF service在 RESTful WCF 服务中缓存对象
【发布时间】:2011-10-04 21:39:05
【问题描述】:

我正在寻找一种使用 RESTful WCF 服务在内存中缓存对象的方法。该服务是完全无状态的,并且托管在 IIS 之外。我想自己实现缓存,所以 memcached 不是一个选项。

现在我正在考虑托管一个单独的有状态System.ServiceModel.ServiceHost 来完成所有缓存。它将通过单独的端口或通过其他方式与其余的 WCF 方法进行通信。但是,我不确定这是否是解决我的问题的理想方法。有人有什么建议吗?

【问题讨论】:

  • 服务是无状态的,这很好。但是,当您说“设置另一个有状态的服务主机”时,这是一种误导。服务主机本身是有状态的,因为它托管服务。为什么不使用同一台主机对图像流进行内存缓存?我看不出拥有两个单独的服务主机的意义。
  • @anas:您当然是对的,但是当服务完全无状态时,我还能如何将某些内容保存在内存中?

标签: c# wcf caching rest


【解决方案1】:

我了解您对无状态服务和有状态主机以及两者如何交互的混淆。

在这个代码示例中,我从概念上演示了内存中的单例(缓存机制,我以后称为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();
            }
        }
    }
}

【讨论】:

  • 我现在明白了。很好的例子,感谢您的澄清。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多