Re[3]: Получить ViewState
От: TK Лес кывт.рф
Дата: 15.11.02 05:38
Оценка:
Здравствуйте, Аноним, Вы писали:

TK>>Для страницы нужно перекрыть SavePageStateToPersistenceMedium/Load...


TK>>А вот собственно пример сохранения ViewState в базу SQL сервера (как получить raw bytes наверное можно разобраться


А>Я попытался у себя использовать этот код.

А>Создал таблицу и SPs

А>Правильно ли все ?


Не знаю. Вот оригинальный код.


if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Session_ViewState_FK1]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[ViewState] DROP CONSTRAINT Session_ViewState_FK1
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[DropLostSession]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[DropLostSession]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[DropSession]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[DropSession]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[LoadPageViewState]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[LoadPageViewState]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SavePageViewState]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[SavePageViewState]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Session]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Session]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ViewState]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ViewState]
GO

CREATE TABLE [dbo].[Session] (
    [SessionID] [int] IDENTITY (1, 1) NOT NULL ,
    [SessionCookie] [varchar] (50) COLLATE Cyrillic_General_CI_AS NOT NULL ,
    [Created] [datetime] NOT NULL ,
    [LastAccess] [datetime] NOT NULL 
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[ViewState] (
    [StateID] [int] IDENTITY (1, 1) NOT NULL ,
    [SessionID] [int] NOT NULL ,
    [RequestStamp] [uniqueidentifier] NULL ,
    [PageState] [image] NULL 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

CREATE PROCEDURE dbo.DropLostSession
AS
BEGIN
    SET NOCOUNT ON
    
    DELETE FROM Session WHERE LastAccess < DATEADD(dd, -2, GETDATE())    
END

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

CREATE Procedure DropSession
    @SessionCookie AS VARCHAR(50)
AS
BEGIN
    SET NOCOUNT ON
    DELETE FROM Session WHERE SessionCookie=@SessionCookie
END


GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

CREATE Procedure LoadPageViewState
    @RequestStamp AS UniqueIdentifier
AS
BEGIN
    SET NOCOUNT ON
    DECLARE @SessionID INT
    DECLARE @StateID INT
    
    SELECT @SessionID=SessionID, @StateID=StateID FROM ViewState WHERE RequestStamp=@RequestStamp
    IF @SessionID IS NOT NULL
    BEGIN
        UPDATE Session SET LastAccess=GETDATE() WHERE SessionID=@SessionID
    
        SELECT PageState FROM ViewState WHERE StateID=@StateID
    END
END




GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

CREATE Procedure SavePageViewState
    @SessionCookie AS VARCHAR(50),
    @ViewState AS IMAGE
AS
BEGIN
    SET NOCOUNT ON
    DECLARE @SessionID INT
    
    SELECT @SessionID=SessionID FROM Session WHERE SessionCookie=@SessionCookie
    IF @SessionID IS NULL
    BEGIN
        INSERT INTO Session (SessionCookie) VALUES (@SessionCookie)
        SELECT @SessionID=@@IDENTITY
    END
    ELSE
    BEGIN
        UPDATE Session SET LastAccess=GETDATE() WHERE SessionID=@SessionID
    END
    
    INSERT INTO ViewState (SessionID, PageState) VALUES (@SessionID, @ViewState)
    
    SELECT RequestStamp FROM ViewState WHERE StateID=@@IDENTITY
END




GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO



А>И каким образом можно теперь этот класс ViewStateModule использовать ?

А>Я так понял где в Global.asax ? На как ?

Нет в Global.asax не надо. Нужно подключить его в виде модуля в web.config.


<configuration>
    <system.web>
        <httpModules>
            <add name="ViewState" type="XXX.Web.ViewStateModule,SQLState" />
        </httpModules>
    </system.web>
</configuration>




Для использования нужно все свои странички наследовать от следующей:


namespace SystemFramework
{
    /// <summary>
    /// Summary description for Page.
    /// </summary>
    public class Page : System.Web.UI.Page
    {
        protected bool ExternalState = true;

        public Page()
        {

        }

        protected override object LoadPageStateFromPersistenceMedium()
        {
            object Result;
            if (ExternalState)
            {
                System.Guid StateCookie = new System.Guid(Request.Params["__VIEWSTATE"]);
                Result = XXX.Web.ViewStateModule.LoadPageViewState(Context, StateCookie);
            }
            else
            {
                Result = base.LoadPageStateFromPersistenceMedium();
            }

            return Result;
        }

        protected override void SavePageStateToPersistenceMedium(object viewState)
        {        
            if (ExternalState)
            {
                System.Guid StateCookie = XXX.Web.ViewStateModule.SavePageViewState(Context, viewState);
                this.RegisterHiddenField("__VIEWSTATE", StateCookie.ToString());
            }
            else
            {
                base.SavePageStateToPersistenceMedium(viewState);
            }
        }

    }
}
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.