PDA

View Full Version : سوال: چگونه دستور ارسال درخواست Ajax از سمت سرور داده شود؟



raravaice
شنبه 16 آذر 1387, 08:45 صبح
سلام

شرح :
همانطور که میدونید درخواست و ارسال پاسخ در Ajax از سمت کلاینت به سرور میباشد یعنی ابتدا باید ما یک در خواست را ارسال کنیم تا سرور بتواند بر اساس درخواست ما جواب مربوط را برای ما ارسال کند.

پس با شرح بالا برای اینکه بخواهیم از تغییری در سمت سرور آگاه شویم میبایست مثلا یک ضربان 10 ثانیه ای درخواست ایجاد کرد که هر 10 ثانیه 1 بار یک در خواست به سرور فرستاده بشه و جواب آن برگشت داده بشه. با این فرض این درخواست به صورت یه ضربان 10 ثانیه ای ارسال میشه!چه تغییرات در سمت سرور انجام شده باشه و چه تغییرات انجام نشده باشه.

مورد مبهم :
ظاهرا به نوع دیگری هم این کار انجام میشه که چند روزیه با اون آشنا شدم ولی هنوز متوجه نشدم جریان از چه قراره.
در این شیوه دیگه ضربان و پروسس اضافی ایجاد نمیشه ظاهرا.
شیوه کار به این صورت هست که درخواست Ajax از سمت کلاینت فقط زمانی ارسال میشه که مقدار مورد نظر در سمت سرور تغییر کرده باشه و هیچ درخواست اضافی دیگه ای که میتونه حاوی جواب تکراری بشه داده نمیشه.

باز هم باز تر میکنم مسئله رو:
یه سروری هست که وضعیت و تعداد کاربران خودش به علاوه گزارش تمامیه اتفاق هایی که داره اتفاق میافته رو به صورت Real تولید و با فرمت XML یا text بر میگردونه یعنی به محض اینکه یه کاربر وصل یا قطع میشه یا هر اتفاق دیگه ای میافته این XML یا text فورا ایجاد میشه و به محظ اینکه این اتفاق افتاد درخواست Ajax از کلاینت برای سرور ارسال میشه.

شیوه و الگوریتم این مسئله چیه و چطور حل شده؟
تمایلی به استفاده از کنترلهای دات نت تحت هیچ شرایطی ندارم.

ممنون

Behrouz_Rad
شنبه 16 آذر 1387, 09:48 صبح
از تکنیک Comet استفاده می کنن.
بدین شکل که در هنگام ارسال درخواست با AJAX، درخواست رو باز نگه میدارن و بلافاصله نتیجه رو برگشت نمیدن.
در این حالت یک Connection پایدار بین کلاینت و سرور بر قراره که به همین دلیل، سرور در هر لحظه که دوست داشت می تونه درخواست رو بفرسته.
پس از ارسال پاسخ، کلاینت مجدداً درخواست دیگری رو با AJAX ارسال می کنه.
البته باز نگه داشتن Connection به مقدار زیاد هم صحیح نیست. چون به ازای هر Connection، یک Thread جدا اختصاص داده میشه. تنظیمات Thread ها در قسمت processModel فایل Web.config قرار داره.

اگر قسمتی رو متوجه نشدی بگو تا بیشتر توضیح بدم.

shahab_ksh
شنبه 16 آذر 1387, 10:23 صبح
البته باز نگه داشتن Connection به مقدار زیاد هم صحیح نیست. چون به ازای هر Connection، یک Thread جدا اختصاص داده میشه. تنظیمات Thread ها در قسمت processModel فایل Web.config قرار داره.


به نظر شما این روش برای بدست آوردن کاربران آنلاین صحیحه؟ یا همون ارسال و پاسخ Ajax بهتره؟

Behrouz_Rad
شنبه 16 آذر 1387, 10:40 صبح
این مورد بستگی مستقیم به امکانات سرور داره. برای یک سرور Shared اصلاً مناسب نیست. تعداد Worker Thread ها به شدت به سرور فشار میاره.
گوگل برای سیستم Chat از طریق GMail از Comet استفاده می کنه. در فریمورک dojo هم امکان استفاده از Comet گنجانده شده.

موفق باشید.

mehdi.mousavi
شنبه 16 آذر 1387, 13:20 عصر
از تکنیک Comet استفاده می کنن. بدین شکل که در هنگام ارسال درخواست با AJAX، درخواست رو باز نگه میدارن و بلافاصله نتیجه رو برگشت نمیدن.
در این حالت یک Connection پایدار بین کلاینت و سرور بر قراره که به همین دلیل، سرور در هر لحظه که دوست داشت می تونه درخواست رو بفرسته. پس از ارسال پاسخ، کلاینت مجدداً درخواست دیگری رو با AJAX ارسال می کنه.

سلام.
نام اصلی این تکنولوژی Ajax Push هستش، اگر چه به اون Reverse Ajax (http://en.wikipedia.org/wiki/Reverse_Ajax) هم میگن! Comet یه واژه عمومی هستش که کلیه این مفاهیم رو در بر میگیره. در نتیجه، اگر قراره این کار توسط Ajax اجرا بشه، بهتره به اون Ajax Push بگیم.

raravaice
شنبه 16 آذر 1387, 20:17 عصر
حقیقت من راهکاری برای پیاده سازیش پیدا نکردم!
readyState زمانی برابر با 4 میشه که درخواست به اتمام رسیده باشه پس باید برای باز نگه داشن توی readyState = 3 کار کرد که این اتفاق هم فقط در FF میافته و IE از 3 پشتیبانی نمیکنه!

چطور باید اتصال رو باز نگه دارم؟

یعنی باید بعد از ارسال درخواست اول به قدری منتظر بمونی که یه جواب بر گشت داده بشه و بعد از برگشت جواب دوباره یه درخواست دیگه فرستاده بشه؟ Comet یا Ajax Push اینجوری هندل میشن؟

اگرنه که یک نمونه ساده میخوام چون توی این بازار داغ یا از jQuery استفاده شده یا prototype ولی من فقط نحوه مرحله به مرحله انجام کار رو میخوام داشته باشم.

ممنون

Behrouz_Rad
شنبه 16 آذر 1387, 22:57 عصر
مثال خوب واسش پیدا نکردم. زیاد هم وقت نشد بگردم... اینو ببین: http://www.codeproject.com/KB/aspnet/CometAsync.aspx

XmlHttpRequest رو به چه شکل ساختی؟ با IE 7.0 به بعد تست کن. شاید ActiveXObject با کد 3 ناسازگاره.
اگر با کد 3 موفق نشدی، با کد 4 تست کن... Thread رو 3 ثانیه Sleep کن. پیش فرض تا 5 ثانیه مجاز به Connection فعال هستی.

Exception
شنبه 16 آذر 1387, 23:20 عصر
من یه نمونه برای خودم پیاده سازی کردم که یکمی منطقش فرق داشت.
من از سمت کلایت یه Request فرستادم، بعد سمت سرور کانکشن رو باز نگه داشتم تا زمانی که اطلاعات لازمه ارسال بشه.
فرقش اینجا بود که زمانی که اطلاعات رسید و اونها رو فرستادم به کلاینت، ارتباط رو از سمت سرور بستم و از سمت کلایت یه Request دیگه برای اطلاعات بعدی فرستادم و باز سرور تا زمانی که وقتش برسه کانکشن رو باز نگه میداشت و همینطور الی آخر.
نظرتون در مورد این روش چیه؟ این هنوز هم comet به حساب میاد و آیا بهینه است و چرا؟

Behrouz_Rad
یک شنبه 17 آذر 1387, 00:54 صبح
من یه نمونه برای خودم پیاده سازی کردم که یکمی منطقش فرق داشت.
من از سمت کلایت یه Request فرستادم، بعد سمت سرور کانکشن رو باز نگه داشتم تا زمانی که اطلاعات لازمه ارسال بشه.
فرقش اینجا بود که زمانی که اطلاعات رسید و اونها رو فرستادم به کلاینت، ارتباط رو از سمت سرور بستم و از سمت کلایت یه Request دیگه برای اطلاعات بعدی فرستادم و باز سرور تا زمانی که وقتش برسه کانکشن رو باز نگه میداشت و همینطور الی آخر.
نظرتون در مورد این روش چیه؟ این هنوز هم comet به حساب میاد و آیا بهینه است و چرا؟

این همون Comet هست دیگه برادر!

raravaice
یک شنبه 17 آذر 1387, 14:21 عصر
شاید ActiveXObject با کد 3 ناسازگاره.
IE کلا خود خواهه. توی 3 شما نمیتونی هیچ data ای ازش بگیری و این مسئله رو به وضوح با یه error alert بهت میگه.



Thread رو 3 ثانیه Sleep کن. پیش فرض تا 5 ثانیه مجاز به Connection فعال هستی.
ولی من نمونه ای رو دیدم که طرف فقط زمان لود یه درخواست میفرستاد و بقیه کار ها در طول مدت زمان عمر صفحه در کلاینت انجام میشد و هیچ درخواست دیگه ای ارسال نمیشد.
fire bug توی مواقعی که در خواست کامل نشده محتوی رو بر نمیگردونه یعنی وقتی روی log این درخواست شما کلیک میکنی هیچ تاثیری نداره مگر اینکه اسرار به دیدن محتوی داخلش داشته باشی که با یک متن error در محتوی مواجه میشید و در این صورت صفحه مذکور دیگه به کارش ادامه نمیده.
این صفحه رو من بیش از 90 دقیقه باز نگه داشتم ، ولی هیچ مشکلی پیش نیامد.
توی این مورد از همون readyState = 3 استفاده شده منتهی چطور این مورد رو حتی توی IE6 هندل کرده عجیبه.
در آدرس http://javascriptly.com/examples/comet یه iframe هست که 3 رو هندل میکنه و هر وقت به 4 برسه stream رو میبنده.
با روشی که شما و Exception (http://barnamenevis.org/forum/member.php?u=44833) عزیز گفت پس باز هم هر درخواستی یه جوابی داره که در زمان بسته شدن اون نشست داده میشه و تفاوت اون اینه که یه Delay وجود داره که میشه از ارسال داده های تکراری جلوگیری کرد.
ولی این روشی که گفتم مثل یک کانال باز فرضی میمونه که کلاینت و سرور فقط با یه درخواست از کلاینت به هم متصل میشن و سرور میتونه داده های خودش رو در هر زمان که خواست ارسال کنه و نشست هیچ وقت بسته نمیشه.


پ.و
البته به جواب سئوال اول رسیدم و باز هم جا داره اینجا از تمامیه دوستان شرکت کننده در بحث تشکر کنم.

ممنون

elemenex.com
شنبه 03 اسفند 1387, 21:40 عصر
You'd better not to use this technique. leting the port be open and overloading the server is not a good idea. use some kind of heart bit to check the status.
if you have more question contact me at elemenex.com (http://www.elemenex.com)
Arash Karimzadeh