【问题标题】:HttpContext.Current Null in CacheItemUpdateCallbackCacheItemUpdateCallback 中的 HttpContext.Current Null
【发布时间】:2013-08-20 15:48:00
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# asp.net caching dynamic updatepanel


    【解决方案1】:

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

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

    更新:

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

    【讨论】:

    • 请原谅我对 asp.net 很陌生。您的意思是编写一个方法来存储数据的旧值并在值更改时检查时间间隔?有没有办法可以在数据更改时发出信号而不是定期检查?
    • 如果您尝试比较新旧数据(它们是全局的吗?),那么您可以将旧数据和新数据存储在缓存中,并在您的页面 ajax 方法调用的服务器方法中进行比较.通常,如果客户端不定期执行轮询以调用该服务器方法,则您无法从服务器向客户端发出信号,但是有一些库可以简化长轮询技术(查看 microsofts signalR asp.net/signalr
    • 谢谢!在进一步阅读了 SignalR 和 Polling 之后,看起来这两种解决方案都可以工作!这是我正在查看的有关 SignalR 的文章,如果它对其他人有帮助:trycatch.me/using-signlar-to-publish-dashboard-data
    猜你喜欢
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多