تبلیغات :
ماهان سرور
آکوستیک ، فوم شانه تخم مرغی ، پنل صداگیر ، یونولیت
دستگاه جوجه کشی حرفه ای
فروش آنلاین لباس کودک
خرید فالوور ایرانی
خرید فالوور اینستاگرام
خرید ممبر تلگرام

[ + افزودن آگهی متنی جدید ]




نمايش نتايج 1 به 3 از 3

نام تاپيک: نوشتن یک چت روم در سیلورلایت (مقدمه ای بر WCF Duplex Communication)

  1. #1
    پروفشنال mahdi7s's Avatar
    تاريخ عضويت
    Sep 2007
    محل سكونت
    هر جایی می تونه باشه
    پست ها
    757

    9 نوشتن یک چت روم در سیلورلایت (مقدمه ای بر WCF Duplex Communication)

    سلام خدمت دوستان گرامی

    در طول این آموزش ما یک چت روم ساده در سیلورلایت خواهیم ساخت که بستر ارتباطاتش WCF خواهد بود

    - Duplex Communication (ارتباط دو طرفه) :
    اغلب ارتباطات بین یک سرور و کلاینت با یک درخواست از طرف کلاینت آغاز و با پاسخ سرور به اتمام می رسد
    این در حالی است که برخی از مواقع سرور می خواهد اطلاعاتی را به کلاینت(ها) ارسال کند که این می شود در خواستی از طرف سرور برای ارسال اطلاعات به کلاینت. و ارتباط دو طرفه یعنی زمانی که هم سرور و هم کلاینت هر دو بتوانند از یک دیگر درخواست و به یک دیگر پاسخ دهند.
    اما ارتباط دو طرفه تحت پروتکل HTTP غیر ممکن است : زیرا پروتکل HTTP بر پایه یک در خواست از طرف کلاینت و سپس پاسخی از طرف سرور است بنابراین در این پروتکل اگر کلاینت درخواستی ندهد سرور نمی تواند پاسخی بدهد.

    پس چگونه یک ارتباط دو طرفه تحت HTTP داشته باشیم؟

    - Polling Duplex Binding در WCF :
    این نوع Binding در WCF معرفی شد تا بتواند یک ارتباط دو طرفه را شبیه سازی کند(البته پروتکل Polling Duplex مخصوص WCF نیست). نحوه ی کار این پروتکل اینگونه است که کلاینت مستمرا" درخواست هایی به سرور می فرستد(Poll) تا از موجود بودن یا نبودن اطلاعات جدید بر روی سرور برای خودش(کلاینت) آگاهی پیدا کند و اگر اطلاعات موجود بود با درخواست کلاینت آن اطلاعات توسط سرور به کلاینت ارسال می شوند.

    مقدمه کافی است. برای نوشتن این برنامه شما باید موارد زیر را نصب کرده باشید:

    MS Visual Studio 2010
    VS Silverlight 4 Tools
    (
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    )

    - شروع کنیم؟!

    VS را باز کنید بر روی New Project کلیک کنید و در پنجره باز شده در قسمت Installed Templates بر روی Silverlight کلیک کنید و در قسمت راست بر روی Silverlight Application کلیک و یک نام برای پروژه بنویسید(من گذاشتم SLSampleChat) و OK را بزنید سپس در قسمت Options پنجره New Silverlight Application که باز می شود Silverlight 4 را انتخاب و Enable WCF RIA Services را تیک بزنید و OK کنید.

    وقتی برای اولین بار پروژه باز می شود تب مربوط به طراحی MainPage باز می شود(این همان صفحه اصلی ای هست که کاربر در مروگرش می بیند).
    یک TextBlock (برای نمایش گفتگوها) و یک TextBox (برای تایپ متن) و یک دکمه (برای ارسال متن) به ترتیب با نام های txtLocalMessages و txtMessage و btnSend بر روی MainPage تان قرار دهید یا می توانید تگ Grid را به شکل زیر ویرایش کنید:

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

    در Solution Explorer بر روی پروژه SLSampleChat.Web راست کلیک کرده و Add -> New Item را انتخاب کنید. در پنجره باز شده در سمت راست(Installed Templates) بر روی Silverlight کلیک کنید و در سمت چپ آیتم Silverlight-enabled WCF Service را انتخاب و نام آن را ChatService.svc بگذارید و بر روی دکمه Add کلیک کنید.

    ChatService.svc را باز کنید و صفت زیر را بالای کلاس ChatService قرار دهید(زیر دو صفت دیگر):

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    صفت فوق تعیین کننده ی رفتار و چگونگی اجرای سرویسی (در اینجا ChatService) است که با آن مزین شده.
    مقدار Single که به خصیصه InstanceContextMode اختصاص داده شده بیانگر این است که سرویس ما فقط یکبار ساخته می شود و کلاینت(ها) از آن استفاده می کنند.
    و مقدار Multiple که به خصیصه ConcurrencyMode اختصاص داده شده باعث می شود سرویس ما MultiThreading (چند نخی) رو پشتیبانی کنه.

    یک رابط (Interface) با نام IChatNotifies به پروژه SLSampleChat.Web اضافه کنید و آن را به شکل زیر ویرایش کنید:

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

    در ادامه شما خواهید دید که ما برای با خبر ساختن کلاینت ها از پیامهای دریافتی در سرور از رابط فوق استفاده خواهیم کرد و در اصل کلاس فوق نقش یک CallBack (همان Event های امروزی) را اجرا می کند.

    به کلاس ChatService برگردید و صفت ServiceContract را به شکل زیر ویرایش کنید:

    این باعث میشه سرویس ما رابطی که CallBack های ما را معرفی کرده بشناسد و در اصل قابلیت Duplex Communication (ارتباط دو طرفه) را به سرویس اضافه کند و کلاینت ها را هم قادر به گوش دادن به این CallBack ها می سازد.

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    سپس فیلد زیر را به سرویس تان اضافه کنید:


    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

    این فیلد کلاینت هایی که به سرور معرفی می شوند را نگهداری می کند.(از نوع SynchronizedCollection استفاده شده چون Thread Safe است و کد را پیچیده نمی کند)

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

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

    متد GetCallbackChannel یک کانال (از نوع IChatNotifies) مربوط به کلاینتی که متد Subscribe را صدا زده بدست می آورد تا ما به وسیله ی آن اطلاعات را از سرور به کلاینت ارسال کنیم.

    نهایتا برای ارسال پیام متد زیر را به سرویس تان اضافه کنید:

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

    متد فوق هم پیام دریافتی را مستقیما به تمام کلاینت ها ارسال می کند.

    بر روی پروژه SLSampleChat.Web راست کلیک کرده و Add Reference را انتخاب کنید سپس در پنجره باز شده

    روی تب Browse کلیک کنید و به آدرس

    C:\Program Files\Microsoft SDKs\Silverlight\v4.0\Libraries\Server بروید (این آدرس می تواند در سیستم شما کمی متفاوت باشد) حالا فایل System.ServiceModel.PollingDuplex.dll را انتخاب کنید و بر روی OK کلیک کنید.

    فایل پیکربندی Web.config را باز کنید و تگ system.serviceModel را به شکل زیر ویرایش کنید:

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

    پیکربندی فوق در ابتدا Polling Duplex Binding رو تعریف می کند(چون این نوع Binding به صورت پیش فرض تعریف نشده است) سپس یک PollingDuplexBinding ایجاد و آن را به Binding سرویس مان (ChatService) اختصاص می دهد.

    (Binding خصوصیات ارتباط بین سرور و کلاینت یک سرویس را مشخص می کند(از جمله نوع پروتکل استفاده شده برای ارتباط))

    از منوی Build گزینه ی Build Solution را انتخاب کنید و پس از Build شدن (اگر در این قسمت به خطایی برخورد کردید یکی از مراحل فوق را اشتباه انجام داده اید و ابتدا باید آن خطا را برطرف کنید) بر روی پروژه ی SLSampleChat راست کلیک کرده و Add Service Reference را بزنید. در پنجره باز شده بر روی دکمه Discover کلیک کنید و سپس بر روی OK کلیک کنید.

    به محیط طراحی MainPage بروید و با کلیک بر روی دکمه Send رویدا کلیک آن را هندل کنید.

    در بالای کلاس MainPage فضای نام SLSampleChat.ServiceReference1 را using کنید و سپس فیلد زیر را به این کلاس اضافه کنید:

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    بوسیله ی این فیلد ما می توانیم سرویسی که در سرور ساخته ایم را صدا بزنیم.

    سازنده کلاس MainPage را به شکل زیر ویرایش کنید:

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


    کد فوق رویداد دریافت پیام از سرور را هندل و کلاینت را به سرور معرفی می کند.

    سپس متد زیر را به کلاس اضافه کنید:

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

    کد بالا چک می کند اگر خطایی هنگام دریافت پیام رخ داده باشد آن را نمایش دهد و در غیر اینصورت پیام را نمایش می دهد.

    و نهایتا در متد کلیک دکمه Send کد زیر را وارد کنید:

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

    کد فوق هم در صورت خالی نبودن پیام آن را به سرور ارسال می کند تا سرور آن را به کلاینت ها ارسال کند.

    چت ما ساخته شد! برای اجرا بر روی دکمه Debug کلیک کنید سپس آدرس صفحه باز شده در مرورگرتان را کپی کنید و در تب یا مرورگری دیگر به آن آدرس بروید و خودتان با خودتان چت کنید!

    دوستان سوالات و مشکلات و تجربیات و ... خود را در این زمینه می توانند همینجا یا به صورت کامنت در وبلاگ من مطرح کنند.

    *هرگونه استفاده از این آموزش بدون ذکر منبع ممنوع می باشد.
    منبع(وبلاگ من):
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    -------------------------------------
    دانلود سورس برنامه
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    ------------------------------------------------
    بیشترین منابع استفاده شده:
    فیلم آموزشی در مورد Duplex Communication
    (
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    )
    کتاب SL Data & Services
    (
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    )
    و ...
    ------------------------------------------------------------------
    موفق باشید
    Last edited by mahdi7s; 03-11-2010 at 14:30. دليل: اشتباه تایپی

  2. 3 کاربر از mahdi7s بخاطر این مطلب مفید تشکر کرده اند


  3. #2
    کاربر فعال انجمن دات نت عــــلی's Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    زیر سایه عرش الهی
    پست ها
    2,335

    پيش فرض

    سلام مهدی جان ممنون عالی بود.
    پس کد جلوگیری از خطای cross-access کجاست؟
    مطمئنی خطای cross نمیده؟.
    Very Very Tanks

  4. #3
    پروفشنال mahdi7s's Avatar
    تاريخ عضويت
    Sep 2007
    محل سكونت
    هر جایی می تونه باشه
    پست ها
    757

    پيش فرض

    پس کد جلوگیری از خطای cross-access کجاست؟
    مطمئنی خطای cross نمیده؟.
    سلام

    در سیلورلایت امکان دسترسی به سرویس های تحت وبی (توجه کنید که پروتکل ارتباطی ما در برنامه فوق HTTP هست) که روی دامنه ای هستند که برنامه سیلورلایت هم آنجا هاست شده(برنامه کلاینت و سرویس روی یک دامنه باشند) وجود دارد.

    مگر اینکه شما بخواهید از دامنه یا هاست یا پورت یا پروتکل متفاوتی به سرویس دسترسی داشته باشید
    یا اینکه پروتکل ارتباطی شما TCP (با استفاده از سوکت ها) باشد یا از net.TCP binding (که در SL 4 اضافه شده)
    استفاده کنید-که در تمام این موارد شما می بایست یک فایل xml برای تایید دسترسی کلاینت در سرور ساخته و با اولین درخواست کلاینت در مورد فایل دسترسی به سروری که برای تایید دسترسی فعال است آن را به کلاینت ارسال کنید(همانطور که قبلا هم گفتم پورت=943 و نام فایل = clientaccesspolicy.xml)

    راستی Thanks نه Tanks (شاید هم منظورتان تانک بوده)

    موفق باشید

  5. این کاربر از mahdi7s بخاطر این مطلب مفید تشکر کرده است


Thread Information

Users Browsing this Thread

هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)

User Tag List

برچسب های این موضوع

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •