Здравствуйте, Аноним, Вы писали:
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);
}
}
}
}
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.