ورود

View Full Version : انتقال Sessionاز 2003به2005(Marshaling)



jannati
یک شنبه 12 اسفند 1386, 09:55 صبح
با سلام به دوستان عزیز
من یک برنامه را قبلا در Visual Studio2003نوشته بودم.حالا بخش های جدیدی را میخواهیم به آن اضافه کنیم.ارجمله در بخش گزارش گیری ها.ترجیح دادیم از 2005استفاده کنیم.اما یکسری Sessionهست که باید از 2003به 2005 منتقل بشه.فکر میکنم به این کار Marshalingمیگن.کسی میتونه راهنمایی کنه؟یا آدرسی یا منبعی برای بررسی بده؟

Behrouz_Rad
یک شنبه 12 اسفند 1386, 11:11 صبح
قصد داری تا بین دو سایت مجزا Session ها رو به اشتراک بگذاری؟
چون معنا نمیده که سایتی همزمان با دو نسخه از دات نت کار کنه!

jannati
یک شنبه 12 اسفند 1386, 12:53 عصر
نه.یک سایت هست.ولی قسمت گزارشاتش رو چون در 2005 خیلی امکانات بیشتری داریم از 2005 استفاده میکنیم.اما برخی Sessionها باید از صفحه لاگین به این بخش منتقل شود.

Behrouz_Rad
یک شنبه 12 اسفند 1386, 13:03 عصر
جواب سوالت رو می تونم الان بدم اما...
چطور برای یک سایت تونستی تعیین کنی که همزمان با دو نسخه از دات نت کار کنه؟ مثلا بعضی صفحات با دات نت 1.1 و برخی با دات نت 2.0؟

jannati
یک شنبه 12 اسفند 1386, 13:18 عصر
ممنون آقای راد.میشه راهنمایی کنید.فکر میکنم من یک اشتباهی کردم.این دو بخش از هم جدا هستند و فقطدر بخش گزارشات یک لینک میدهیم به آدرسی که برنامه تحت 205 راگذاشته ایم تا اجرا شود.فکر کنم منظور شما از سایت مجزا همین بود...2 تا آدرس داریم که در یکی دیگری را صدا میزنیم.حالا چطور به اشتراک بگذاریم؟

raravaice
یک شنبه 12 اسفند 1386, 13:21 عصر
چطور برای یک سایت تونستی تعیین کنی که همزمان با دو نسخه از دات نت کار کنه؟ مثلا بعضی صفحات با دات نت 1.1 و برخی با دات نت 2.0؟
نشدنی نیست من اینکارو کردم البته روی یه ساب دامین که روت اون بیرون روت 1.1 هست چون در غیر این صورت هنگ میکرد.

موفق باشید

Behrouz_Rad
یک شنبه 12 اسفند 1386, 13:22 عصر
دیدی گفتم نمیشه؟ :D

مدیریت Session ها در ASP.NET به طور پیش فرض InProc هست. یعنی Session ها در حافظه ی سرور نگهداری میشن.
می تونی این حالت رو تغییر بدی و به SQLServer تنظیم کنی.
در این حالت نیاز به یک دیتابیس اضافه با نام ASPState داری تا مدیریت و نگهداری Session ها در این دیتابیس انجام بشه.
این دیتابیس با اجرای فایل اسکریپت InstallSqlState.sql که در مسیر System\Microsoft.NET\Framework\version هست ایجاد میشه.

پیکربندی Web.Config:


<sessionState
mode="SQLServer"
sqlConnectionString="..."
cookieless="false"
</system.web>
</configuration>


موفق باشید.

پ.ن: من این روش رو امتحان نکردم اما می دونیم که این روش وجود داره و در تئوری جواب میده.
نتیجه رو همینجا اعلام کن.

jannati
یک شنبه 12 اسفند 1386, 13:30 عصر
ممنون .تست میکنم خبر میدم.

raravaice
یک شنبه 12 اسفند 1386, 13:36 عصر
InstallSqlState.sql
من چند وقت پیش که امتحان کردم :
اجرای این query برای سطح دسترسی user امکان پذیر نیست و حتما سطح admin رو توی sql server لازم داره.
راه دیگه ای هست برای اجرای این query؟ چون ظاهرا با master و msdb سروکار داره!

ساده ترین راهی که برای حل این مسئله به ذهن من رسید استفاده از کوکی برای انتقال اطلاعات session بین دو app بود.
"البته در یک حوزه دامین"


موفق باشید

Behrouz_Rad
یک شنبه 12 اسفند 1386, 14:22 عصر
اجرای این query برای سطح دسترسی user امکان پذیر نیست و حتما سطح admin رو توی sql server لازم داره.

دو تا جدول با نام های ASPStateTempSessions و ASPStateTempApplications هستند که در دیتابیس tempdb اجرا میشن.
چون به دیتابیس tempdb دسترسی نداری، واضحه که در اجرای این اسکریپت مشکل به وجود میاد.
اون اسکریپت رو دستکاری کن تا این جداول رو در دیتابیس ASPState ایجاد کنه + کلیه ی دستوراتی که با دیتابیس tempdb سر و کار دارند.

پ.ن: اسکریپت های آماده ی عرضه شده با ASP.NET 2.0 پر از باگ و مشکل هستند.
مثلا خوبه که بدونید اسکریپت سیستم Profiler در دات نت به شدت سرعت و کارایی سیستم و برنامتون رو پایین میاره!

raravaice
یک شنبه 12 اسفند 1386, 14:34 عصر
یعنی کل این query یه db میسازه به نام ASPState و دوتا جدول با فیلدهای مشخص که توی کوری هست و مشکل حل؟
یا بازم لازمه که جای دیگه ای تغییر داده بشه؟

منظور اینکه من فرضی که یه کاربرم و با فرض اینکه چنین dbname روی سرور نباشه که هست و ایجادش کنم میتونم ازش استفاده کنم یا اینکه لازم هست یه سری پارامترها با سرور هماهنگ بشه؟

بازم ممنون
این سئوال یکی از سئوالات آزار دهنده برای من بود خوشحالم که اتفاقی دارم به نتیجه میرسم.
موفق باشید

متن دقیق ایرادی که در شرایط فعلی داره میگیره :


Msg 3701, Level 11, State 1, Line 4
Cannot drop the database 'ASPState', because it does not exist or you do not have permission.
Msg 229, Level 14, State 5, Line 4
SELECT permission denied on object 'sysjobs', database 'msdb', schema 'dbo'.
Msg 262, Level 14, State 1, Line 23
CREATE DATABASE permission denied in database 'master'.
Msg 916, Level 14, State 1, Line 2
The server principal "FARAMARZ" is not able to access the database "ASPState" under the current security context.
Msg 2754, Level 16, State 1, Line 4
Error severity levels greater than 18 can only be specified by members of the sysadmin role, using the WITH LOG option.
Msg 262, Level 14, State 1, Procedure DropTempTables, Line 12
CREATE PROCEDURE permission denied in database 'master'.
Msg 262, Level 14, State 1, Procedure GetMajorVersion, Line 27
CREATE PROCEDURE permission denied in database 'master'.
Msg 2812, Level 16, State 62, Line 4
Could not find stored procedure 'GetMajorVersion'.
Msg 262, Level 14, State 1, Procedure CreateTempTables, Line 25
CREATE PROCEDURE permission denied in database 'master'.
Msg 262, Level 14, State 1, Procedure ResetData, Line 6
CREATE PROCEDURE permission denied in database 'master'.
Warning: User types created via sp_addtype are contained in dbo schema. The @owner parameter if specified is ignored.
Msg 15247, Level 16, State 1, Procedure sp_addtype, Line 31
User does not have permission to perform this action.
Warning: User types created via sp_addtype are contained in dbo schema. The @owner parameter if specified is ignored.
Msg 15247, Level 16, State 1, Procedure sp_addtype, Line 31
User does not have permission to perform this action.
Warning: User types created via sp_addtype are contained in dbo schema. The @owner parameter if specified is ignored.
Msg 15247, Level 16, State 1, Procedure sp_addtype, Line 31
User does not have permission to perform this action.
Warning: User types created via sp_addtype are contained in dbo schema. The @owner parameter if specified is ignored.
Msg 15247, Level 16, State 1, Procedure sp_addtype, Line 31
User does not have permission to perform this action.
Warning: User types created via sp_addtype are contained in dbo schema. The @owner parameter if specified is ignored.
Msg 15247, Level 16, State 1, Procedure sp_addtype, Line 31
User does not have permission to perform this action.
Msg 2715, Level 16, State 3, Procedure GetHashCode, Line 2
Column, parameter, or variable #1: Cannot find data type tAppName.
Parameter or variable '@input' has an invalid data type.
Msg 2715, Level 16, State 3, Procedure TempGetAppID, Line 2
Column, parameter, or variable #1: Cannot find data type tAppName.
Parameter or variable '@appName' has an invalid data type.
Msg 2715, Level 16, State 3, Procedure TempGetAppID, Line 2
Column, parameter, or variable #3: Cannot find data type tAppName.
Parameter or variable '@dupApp' has an invalid data type.
Msg 2812, Level 16, State 62, Line 4
Could not find stored procedure 'GetMajorVersion'.
Msg 2715, Level 16, State 3, Line 81
Column, parameter, or variable #1: Cannot find data type tSessionId.
Parameter or variable '@id' has an invalid data type.
Msg 2715, Level 16, State 3, Line 81
Column, parameter, or variable #2: Cannot find data type tSessionItemShort.
Parameter or variable '@itemShort' has an invalid data type.
Msg 2715, Level 16, State 3, Line 81
Column, parameter, or variable #6: Cannot find data type tTextPtr.
Parameter or variable '@textptr' has an invalid data type.
Msg 2812, Level 16, State 62, Line 3
Could not find stored procedure 'GetMajorVersion'.
Msg 2812, Level 16, State 62, Line 4
Could not find stored procedure 'GetMajorVersion'.
Msg 2715, Level 16, State 3, Line 102
Column, parameter, or variable #1: Cannot find data type tSessionId.
Parameter or variable '@id' has an invalid data type.
Msg 2715, Level 16, State 3, Line 102
Column, parameter, or variable #2: Cannot find data type tSessionItemShort.
Parameter or variable '@itemShort' has an invalid data type.
Msg 2715, Level 16, State 3, Line 102
Column, parameter, or variable #6: Cannot find data type tTextPtr.
Parameter or variable '@textptr' has an invalid data type.
Msg 2812, Level 16, State 62, Line 4
Could not find stored procedure 'GetMajorVersion'.
Msg 2812, Level 16, State 62, Line 4
Could not find stored procedure 'GetMajorVersion'.
Msg 2715, Level 16, State 3, Line 31
Column, parameter, or variable #1: Cannot find data type tSessionId.
Parameter or variable '@id' has an invalid data type.
Msg 2812, Level 16, State 62, Line 4
Could not find stored procedure 'GetMajorVersion'.
Msg 2715, Level 16, State 3, Line 70
Column, parameter, or variable #1: Cannot find data type tSessionId.
Parameter or variable '@id' has an invalid data type.
Msg 2715, Level 16, State 3, Line 70
Column, parameter, or variable #2: Cannot find data type tSessionItemShort.
Parameter or variable '@itemShort' has an invalid data type.
Msg 2812, Level 16, State 62, Line 4
Could not find stored procedure 'GetMajorVersion'.
Msg 2715, Level 16, State 3, Line 68
Column, parameter, or variable #1: Cannot find data type tSessionId.
Parameter or variable '@id' has an invalid data type.
Msg 2715, Level 16, State 3, Line 68
Column, parameter, or variable #2: Cannot find data type tSessionItemLong.
Parameter or variable '@itemLong' has an invalid data type.
Msg 2812, Level 16, State 62, Line 4
Could not find stored procedure 'GetMajorVersion'.
Msg 2715, Level 16, State 3, Line 39
Column, parameter, or variable #1: Cannot find data type tSessionId.
Parameter or variable '@id' has an invalid data type.
Msg 2715, Level 16, State 3, Line 39
Column, parameter, or variable #2: Cannot find data type tSessionItemShort.
Parameter or variable '@itemShort' has an invalid data type.
Msg 2812, Level 16, State 62, Line 4
Could not find stored procedure 'GetMajorVersion'.
Msg 2715, Level 16, State 3, Line 41
Column, parameter, or variable #1: Cannot find data type tSessionId.
Parameter or variable '@id' has an invalid data type.
Msg 2715, Level 16, State 3, Line 41
Column, parameter, or variable #2: Cannot find data type tSessionItemShort.
Parameter or variable '@itemShort' has an invalid data type.
Msg 2812, Level 16, State 62, Line 4
Could not find stored procedure 'GetMajorVersion'.
Msg 2715, Level 16, State 3, Line 39
Column, parameter, or variable #1: Cannot find data type tSessionId.
Parameter or variable '@id' has an invalid data type.
Msg 2715, Level 16, State 3, Line 39
Column, parameter, or variable #2: Cannot find data type tSessionItemLong.
Parameter or variable '@itemLong' has an invalid data type.
Msg 2812, Level 16, State 62, Line 4
Could not find stored procedure 'GetMajorVersion'.
Msg 2715, Level 16, State 3, Line 41
Column, parameter, or variable #1: Cannot find data type tSessionId.
Parameter or variable '@id' has an invalid data type.
Msg 2715, Level 16, State 3, Line 41
Column, parameter, or variable #2: Cannot find data type tSessionItemLong.
Parameter or variable '@itemLong' has an invalid data type.
Msg 2715, Level 16, State 3, Procedure TempRemoveStateItem, Line 2
Column, parameter, or variable #1: Cannot find data type tSessionId.
Parameter or variable '@id' has an invalid data type.
Msg 2812, Level 16, State 62, Line 3
Could not find stored procedure 'GetMajorVersion'.
Msg 2715, Level 16, State 3, Line 24
Column, parameter, or variable #1: Cannot find data type tSessionId.
Parameter or variable '@id' has an invalid data type.
Msg 2812, Level 16, State 62, Line 4
Could not find stored procedure 'GetMajorVersion'.
Msg 262, Level 14, State 1, Procedure DeleteExpiredSessions, Line 10
CREATE PROCEDURE permission denied in database 'master'.
Msg 2812, Level 16, State 62, Line 2
Could not find stored procedure 'CreateTempTables'.
Msg 262, Level 14, State 1, Procedure ASPState_Startup, Line 6
CREATE PROCEDURE permission denied in database 'master'.
Msg 15165, Level 16, State 1, Procedure sp_procoption, Line 40
Could not find object 'ASPState_Startup' or you do not have permission.
Msg 229, Level 14, State 5, Line 11
SELECT permission denied on object 'syscategories', database 'msdb', schema 'dbo'.
Msg 229, Level 14, State 5, Procedure sp_add_job, Line 1
EXECUTE permission denied on object 'sp_add_job', database 'msdb', schema 'dbo'.

Behrouz_Rad
یک شنبه 12 اسفند 1386, 15:00 عصر
این اسکریپت با چند دیتابیس در ارتباطه.
برای اجرای اون در مرحله ی اول نیاز به سطح دسترسی ادمین هست (می تونه هم نباشه!) اما فقط یک بار. در مراتب بعد که در حقیقت برنامه اجرا میشه، میشه کاری کرد که سطح دسترسی معمول کفایت کنه.
مثلا در ابتدا یک job برای حذف Session ها در بازه های زمانی مشخص در جدول msdb اجرا میشه.
یا از دیتابیس master برای کوئری گرفتن از جداول سیستمی استفاده میشه.
و یا از tempdb برای ایجاد دو جدول در اون کمک گرفته میشه.
بدیهیه که سطح دسترسی یک کاربر در یک Shared Server تنها محدود به دیتابیس خودش هست.
من فکر می کنم بشه با تغییراتی در این اسکریپت (هر چند وقت گیر) کاری کرد که این اسکریپت کاملا به دیتابیس خودمون متکی باشه.
به نظر من دستکاری SP ها و جداول برای ایجاد در دیتابیسی دیگه خللی در اجرای برنامه ایجاد نمی کنه چون ماژول ها و روالی هایی که با این دیتابیس سر و کار دارند، تنها نام SP رو فراخوانی می کنن و کاری ندارند که این اطلاعات در کجا ذخیره میشه.

موفق باشید.

raravaice
یک شنبه 12 اسفند 1386, 15:08 عصر
برای اجرای اون در مرحله ی اول نیاز به سطح دسترسی ادمین هست اما فقط یک بار. در مراتب بعد که در حقیقت برنامه اجرا میشه، میشه کاری کرد که سطح دسترسی معمول کفایت کنه.

پس ظاهرا حدسم درست بوده و دسترسی ادمین رو میخواد.

یه نکته که نظر منو جلب کرده اینه که من الان توی دیتا بیس این سرورم چنین DB رو دارم امکانش هست از همون استفاده کنم؟
چه جوری؟




من فکر می کنم بشه با تغییراتی در این اسکریپت (هر چند وقت گیر) کاری کرد که این اسکریپت کاملا به دیتابیس خودمون متکی باشه.
به نظر من دستکاری SP ها و جداول برای ایجاد در دیتابیسی دیگه خللی در اجرای برنامه ایجاد نمی کنه چون ماژول ها و روالی هایی که با این دیتابیس سر و کار دارند، تنها نام SP رو فراخوانی می کنن و کاری ندارند که این اطلاعات در کجا ذخیره میشه.

من هم امیدوارم که بشه ولی جایی اثری ازش پیدا نکردم شما اگر راهی به ذهنت رسید دریغ نکنید لطفا چون من روی SQL کوری زیاد مسلط نیستم.

ممنون

Behrouz_Rad
یک شنبه 12 اسفند 1386, 18:13 عصر
یه نکته که نظر منو جلب کرده اینه که من الان توی دیتا بیس این سرورم چنین DB رو دارم امکانش هست از همون استفاده کنم؟
چه جوری؟

میتونی استفاده کنی اما مشکلی که من احساس می کنم در این بین وجود داره مسئله ی امنیت Session هاست.
چون دستور * Select رو میشه روی جداول این دیتابیس اجرا کرد.
خوشبختانه در دات نت 2.0 خاصیت allowCustomSqlDatabase معرفی شد که اجازه میده یک دیتابیس با نام دلخواه برای نگهداری Session ها اختصاص داده بشه.
اگر این خاصیت true باشه میشه برای Initial Catalog نام دیتابیس رو تعیین کرد. در غیر اینصورت ذکر Initial Catalog مجاز نیست و به طور پیش فرض ASPState در نظر گرفته میشه.

به جای فایل InstallSqlState.sql میشه فایل InstallPersistSqlState.sql رو اجرا کرد. (قبل از اینکار باید فایل UninstallPersistSqlState.sql اجرا بشه)
اسکریپت InstallPersistSqlState.sql اون دو جدول مشکل ساز رو در دیتابیس ASPState ایجاد می کنه و کاری با tempdb نداره! ( یک قدم پیشرفت! ;) )
ضمن اینکه ابزار aspnet_regsql عمل نصب رو بهتر انجام میده.

در نهایت اون چه که مسلمه اینه که این کار شدنیه اما به شدت نیاز به تغییر و سفارشی کردن اسکریپت دیتابیس داره.

موفق باشید.

raravaice
دوشنبه 13 اسفند 1386, 10:55 صبح
میتونی استفاده کنی اما مشکلی که من احساس می کنم در این بین وجود داره مسئله ی امنیت Session هاست.
چون دستور * Select رو میشه روی جداول این دیتابیس اجرا کرد.تست کردم ولی کاربر دسترسی نداره و مسئولین 2 تا از هاستهام هم نمیدونم به چه دلیلی از دادن دسترسی امتنا میکردن.



خوشبختانه در دات نت 2.0 خاصیت allowCustomSqlDatabase معرفی شد که اجازه میده یک دیتابیس با نام دلخواه برای نگهداری Session ها اختصاص داده بشه.
اگر این خاصیت true باشه میشه برای Initial Catalog نام دیتابیس رو تعیین کرد. در غیر اینصورت ذکر Initial Catalog مجاز نیست و به طور پیش فرض ASPState در نظر گرفته میشه.
این یه تئوری یا مسئله حل شده عملی؟
یعنی من کاربر میتونم یه دیتابیس با هر نامی بسازم و جداول ASPState ایجاد کنم و بعد به Initial Catalog نام جدولم رو بدم برای نگهداری session? یا حتی توی db فعلی خودم؟



به جای فایل InstallSqlState.sql میشه فایل InstallPersistSqlState.sql رو اجرا کرد. (قبل از اینکار باید فایل UninstallPersistSqlState.sql اجرا بشه)
اسکریپت InstallPersistSqlState.sql اون دو جدول مشکل ساز رو در دیتابیس ASPState ایجاد می کنه و کاری با tempdb نداره!

کوءری موجود روی net2 باز هم دسترسی admin میخواد UninstallPersistSqlState.sql رو چک کردم میگه :



--------------------------------------------------
Starting execution of UninstallPersistSqlState.SQL
--------------------------------------------------

--------------------------------------------------
Note:
This file is included for backward compatibility
only. You should use aspnet_regsql.exe to install
and uninstall SQL session state.

Run 'aspnet_regsql.exe -?' for details.
--------------------------------------------------
Msg 916, Level 14, State 1, Line 56
The server principal "chiliclick" is not able to access the database "ASPState" under the current security context.
و InstallPersistSqlState.sql هم خطهای error زیادی داشت که از حوصله این تاپیک خارج ولی چیزی که من فهمیدم اینه که علاوه بر همه فعالیت هاش میخواد یه کارهایی هم توی master انجام بده که برای عموم امکان پذیر نیست.


CREATE PROCEDURE permission denied in database 'master'.
Msg 2715, Level 16, State 3, Procedure GetHashCode, Line 4
و اسکریپت net1.1 هم که تقریبا همین بود با کمی تفاوت.

ولی اگر مورد دومی که اشاره کردید یعنی بشه یه دیتابیس مجزا توسط کاربر برای این کار تعریف بشه و توی config های برنامه معرفی بشه نکته جالبیه که با ید در موردش تحقیق کرد.

موفق باشید

Behrouz_Rad
دوشنبه 13 اسفند 1386, 12:51 عصر
یعنی من کاربر میتونم یه دیتابیس با هر نامی بسازم و جداول ASPState ایجاد کنم و بعد به Initial Catalog نام جدولم رو بدم برای نگهداری session? یا حتی توی db فعلی خودم؟

بله میشه.
مستنداتش در MSDN هست.