2

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

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

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

创建内容的方法,其中容器是我页面上的 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()
    }
}
4

1 回答 1

0

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

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

更新:

有一些库可用于服务器更新客户端,而程序员无需了解/实现长轮询/轮询技术。看看 SignalR http://www.asp.net/signalr

于 2013-08-20T15:58:18.340 回答