Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка под ASP.NET > Как брать данные из кэша?


Автор: Kosya4ok 26.2.2008, 13:43
Все привет! Не пожскажете как можно сделать следующее?
Как сделать так что бы asp страничка сперва делала запрос на сервер за какими то данными, затем на 1 минуту сохраняла данные в своем кеше, и пользователи которые будут обращаться к данному серверу то эта страничка брала бы значение из кеша, по истечении 1 минуты aspx страичка снова дела запрос на веб сервер и т.д...

Написал вот такое:
Но шо то данные беруться не из кеша а каждую секунду идет обрашение к веб серверу:
Код

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Footer.aspx.cs" Inherits="Footer"
    EnableSessionState="False" %>
<%@ OutputCache Duration="60" VaryByParam = "None" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="refresh" content="60">
    
    <title>Footer</title>

    <script src="javascript/common.js" type="text/javascript"></script>

    <link rel="stylesheet" href="fck_editorarea.css" type="text/css" media="all" />

    <script language="javascript" src="javascript/reader.js"></script>

    <style>
        .hideDiv
        {
            display:none;
        }            
        .showDiv
        {
            display:true;
        }
    </style>   
</head>
<body>
    <form id=form1 runat=server>
           <div id = MessageShowDiv class = showDiv>
                  <nobr><asp:Literal id=DisplayString  Visible=true runat=server Mode=Transform/></nobr>
          </div>
                <marquee behavior=scroll scrolldelay=10 
                onmouseover = this.stop() onmouseout=this.start() loop=-1>
                <%= DisplayString.Text = CacheForFooter.FooterReader () %> <!-- Метод который обращется к веб серверу -->
                     <div id = MarqDiv style=border:none class = hideDiv > 
                    </div>
            </marquee>
    </form>
</body>
</html>

Файл Footer.cs в его метод Page_Load я ничего не дописывал...

Автор: Kosya4ok 26.2.2008, 18:30
Всем спасибо за внимание! Сам дописал  smile 

Автор: Kosya4ok 27.2.2008, 13:14
Теперь вопрос немного изменился. Раммотрим например такую ситуацию. Допустим несколько юзеров пытаются получить доступ к странице и один из них отправляет запрос на веб сервисы, а в это время других киентов надо как то залочить. Далее обработанный запрос от веб сервисов помещается в кеш и затем из кеша вернуть им всем резальтат выполнения одного запроса к веб сервису...

Автор: Mymik 27.2.2008, 20:50
попробуй после выполнения сделать 
Код

Response.Cache.SetNoServerCaching();

Думаю что получится

Автор: Kosya4ok 27.2.2008, 21:31
Ниче не понял. Этот кусочек куда надо вставить то?
Например вот у меня страничка под номером 1 к которой обращаются клиенты. В ней я делаю запрос на веб сервисы и ответ сохраняю в кеш на 1 минуту. В это время другие юзера также открывают свои странички и им с кеша возвраащеться значение.
Код

public partial class Footer : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {    
        string str = CacheForFooter.FooterReader(); //функция которая вызывает веб сервисы
        Context.Cache.Insert("key", str, null, DateTime.Now.AddSeconds(60), TimeSpan.Zero);
    }
}

Но вот представим что одновременно клиенты делаю запрос к данной страничке, то для того чтобы снизить нагрузку на сервер следует самого перпого пропустить а остальных залочить, а когда вернеться запрос с сервера вернуть из кеша им значение.
Вы бы не могли болле одробно описать что и куда вставлять ваш код?

Автор: Kosya4ok 27.2.2008, 23:44
Ээээ..да проблема уже не актуальна  smile 
Заметил что када пишешь то сам понимаешь че делать то надо... smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)