CacheItemUpdateCallback中的HttpContext.Current Null

时间:2013-08-20 15:48:00

标签: c# asp.net caching dynamic updatepanel

我希望从当前页面访问一个方法来创建动态控件并将它们附加到更新面板。我想在我的CacheItemUpdateCallback结束时调用此方法,以在缓存中显示新数据。

经过一些研究后,您似乎无法从异步方法访问HttpContext.Current,因为它是特定于线程的。

是否有更好的流程可以在将新值写入缓存后强制刷新动态内容,还是有一种方法可以从我的CacheItemUpdateCallback访问HttpContext.Current?

创建内容的方法,其中container是我页面上div对象的数组:

public void createInnerHtml()
{
    this.contentLength = ddlContentNumber.SelectedIndex + 1;
    for (int i = 0; i < this.contentLength; i++)
    {
        containers[i].Controls.Clear();
        containers[i].Attributes["Data-Value"] = mainFeeds[i].DataValue.ToString();
        containers[i].InnerHtml = mainFeeds[i].getHeaderString();
        containers[i].Controls.Add(controlManager.getControl(mainFeeds[i]));
    }
}

我希望能做什么:

private void openIncidentsUpdateCallback(string key, CacheItemUpdateReason reason, out object expensiveObject, out CacheDependency dependency, out DateTime absoluteExpiration, out TimeSpan slidingExpiration)
{
    dependency = null;
    absoluteExpiration = DateTime.Now.AddSeconds(25);
    slidingExpiration = Cache.NoSlidingExpiration;
    expensiveObject = getExpensiveObject() 

    Page page = (Page)HttpContext.Current.Handler;
    if (page != null)
    {
        ((ReportPage)page).createInnerHtml();
        page.updatePanel1.update()
    }
}

1 个答案:

答案 0 :(得分:0)

基本上,您必须创建一个调用查询缓存对象的方法的ajax轮询。您无法从缓存过期回调更新页面,因为使用的线程与请求对象无关(它是asp.net/iis进程的一部分,而不是与HttpRequest有关的任何内容。填充了上下文))。

所以基本上在页面上你需要显示数据创建一个$ .ajax或者使用一个asp.net ATLAS计时器(如果你愿意,可以直接使用.js ajax)调用asmx端点或者可以查询的WebMethod HttpContext.Current.Cache并返回相应的字符串/ html / json / xml /无论数据。

更新:

在没有程序员理解/实现长轮询/轮询技术的情况下,有可用于服务器更新客户端的库。看看SignalR http://www.asp.net/signalr