C# 缓存代理服务器

C# 缓存代理服务器,c#,network-programming,httpwebrequest,C#,Network Programming,Httpwebrequest,我正在构建一个缓存代理服务器,我想知道是否有人可以帮我处理缓存。我使用的是c#,它只是一个控制台应用程序,我的缓存似乎不起作用。浏览器中的选项卡将是代理服务器的客户端,每个客户端(选项卡)只能有一个缓存来访问它 public class CacheManager { private static CacheManager _instance; private static readonly object _syncLock = new object( ); private

我正在构建一个缓存代理服务器,我想知道是否有人可以帮我处理缓存。我使用的是c#,它只是一个控制台应用程序,我的缓存似乎不起作用。浏览器中的选项卡将是代理服务器的客户端,每个客户端(选项卡)只能有一个缓存来访问它

public class CacheManager
{
    private static CacheManager _instance;
    private static readonly object _syncLock = new object( );
    private static ObjectCache _currentCache = MemoryCache.Default;

    private CacheManager( )
    {
    }

    public static CacheManager Instance
    {
        get
        {
            lock ( _syncLock )
            {
                if ( _instance == null )
                    _instance = new CacheManager( );
            }
            return _instance;
        }
    }


    public bool Contains( string key )
    {
        return _currentCache[ key ] != null;
    }

    public T Get<T>( string key )
    {
        return ( T )_currentCache[ key ];
    }

    public void Add<T>( string key, T data ) where T : class
    {
        if ( data != null )
        {
            var cachePolicy = new CacheItemPolicy
            {
                AbsoluteExpiration = DateTime.Now.AddHours( 1 ),
                SlidingExpiration = TimeSpan.Zero
            };

            _currentCache.Add( new CacheItem( key, data ), cachePolicy );
        }
    }

    public void Remove( string key )
    {
        if ( !Contains( key ) ) return;

        _currentCache.Remove( key );
    }

}
公共类缓存管理器
{
私有静态CacheManager_实例;
私有静态只读对象_syncLock=new object();
私有静态ObjectCache\u currentCache=MemoryCache.Default;
专用缓存管理器()
{
}
公共静态CacheManager实例
{
收到
{
锁(同步锁)
{
if(_instance==null)
_instance=newcachemanager();
}
返回_实例;
}
}
公共bool包含(字符串键)
{
返回_currentCache[key]!=null;
}
公共T获取(字符串键)
{
返回(T)_currentCache[键];
}
公共void Add(字符串键,T数据),其中T:class
{
如果(数据!=null)
{
var cachePolicy=新的CacheItemPolicy
{
绝对过期=DateTime.Now.AddHours(1),
SlidingExpiration=TimeSpan.Zero
};
_添加(新的缓存项(键、数据)、缓存策略);
}
}
公共无效删除(字符串键)
{
如果(!Contains(key))返回;
_currentCache.Remove(键);
}
}
这里我在我的客户机类中调用它:

if( cache.Contains( _host ) )
        {
            //Console.WriteLine( "Object in cache! :D" );
            var get = ( String )cache.Get<String>( _host );

            _cacheBuffer = Encoding.ASCII.GetBytes( get );

            ClientSocket.Send( _cacheBuffer );

        }

        else
        {
            Action inv = ( ) => StartTransferToBrowser( );
            inv.Invoke( );
        }
if(cache.Contains(_host))
{
//WriteLine(“缓存中的对象!:D”);
var get=(String)cache.get(_host);
_cacheBuffer=Encoding.ASCII.GetBytes(get);
发送(_cacheBuffer);
}
其他的
{
Action inv=()=>starttTransferToBrowser();
inv.Invoke();
}

任何帮助都可以。

你有什么问题?/什么部分“不起作用”?更好地定义问题。您是否遇到异常?当我第一次在浏览器中发出某些请求时,加载页面需要正常的量,但当我第二次重新加载页面时,代理服务器应缓存页面,并应减少加载。但事实并非如此。我没有任何例外。我不能发布我的全部代码,因为它太长了。立即执行的lambda怎么了?这两行可以重写
startttransfertobrowser()。根据您的代码和说明,这应该是可行的。我建议您编写一些单元测试来测试CacheManager类的行为和/或使用调试程序逐步完成您的问题是什么?/什么部分“不起作用”?更好地定义问题。您是否遇到异常?当我第一次在浏览器中发出某些请求时,加载页面需要正常的量,但当我第二次重新加载页面时,代理服务器应缓存页面,并应减少加载。但事实并非如此。我没有任何例外。我不能发布我的全部代码,因为它太长了。立即执行的lambda怎么了?这两行可以重写
startttransfertobrowser()。根据您的代码和说明,这应该是可行的。我建议您编写一些单元测试来测试CacheManager类的行为和/或使用调试器逐步执行