我需要在每个API请求中检索我需要检索的会话(或ASP.NET Web API中的任何内容)中存储一些信息.我们将有一个api IIS网站,并将通过主机头添加多个网站绑定.当任何请求进入时,例如api.xyz.com,将检查主机头并将该网站信息存储在会话中,该会话将在调用数据库时在每个后续api请求中使用.
我知道ASP.NET Web API中没有对会话的支持.有没有其他方法来处理这种情况?我在哪里可以存储可以在每个后续请求中检索的信息?
谢谢.
我有一个使用新的.NET 4 System.Runtime.Caching MemoryCache的MVC 3应用程序的问题.我注意到在看似无法预测的时间之后,它会停止缓存,并且表现得像空的一样.考虑一下我直接从ASP.NET MVC中的测试View获取的代码:
MemoryCache.Default.Set("myname","fred", new CacheItemPolicy() { SlidingExpiration = new TimeSpan(0,5,0) });
Response.Write(MemoryCache.Default["myname"]);
Run Code Online (Sandbox Code Playgroud)
当它工作时,可预测的"fred"被打印出来.但是,当问题开始出现时,尽管如此Set(),值为MemoryCache.Default["myname"]null.我可以通过在线上设置断点Response.Write()并使用立即窗口直接设置和读取缓存来证明这一点- 它不会设置它并保持为空!让它再次运行的唯一方法是使AppDomain回收.
有趣的是,当应用程序正常工作时,我可以通过打破Response.Write()线路并运行来激发问题MemoryCache.Default.Dispose().之后,MemoryCache.Default本身不为null(为什么会这样?),但不保存任何设置.它不会导致任何错误,但不会保存任何内容.
任何人都可以验证并解释吗?我相信我已经发现,当应用程序停止工作时,有些东西是Disposing MemoryCache.Default,但这不是我!
UPDATE
好吧,我现在厌倦了这个问题!CLRProfiler似乎不适用于MVC 3.SciTech的CLR工具很好 - RedGate ANTS也是如此.但他们告诉我的只是MemoryCache对象被某些东西处理掉了!我还证明了(通过时间戳打印)我的页面上应该被缓存的部分视图(由OutputCacheAttribute指定)在几分钟后停止缓存 - 它会在每次调用页面时开始刷新.为了澄清环境,我直接在运行Win 7 Ultimate的开发工作站上的IIS 7.5服务器上运行.上面提到的内存工具表明我在播放对象方面只使用了大约9mb的内存.
无奈之下,我已经改变了我的缓存代码,首先搜索环境HttpContext以挂钩并使用其缓存功能(如果有的话).早期测试显示这是可靠的,但感觉就像一个讨厌的黑客.
我觉得MemoryCache和OutputCache不能保证与MVC 3一起工作......