سبد (0)

درخواست های HTTP در Workflow

اجرای درخواست های HTTP در Workflow بصورت غیرهمزمان یا Asynchron

با استفاده از کلاس WebRequest می توانیم یک درخواست HTTP در کدمان ایجاد کنیم. اما همانطور که می دانید اجرای هر درخواست وبی حداقل چند ثانیه و یا حتی چند دقیقه طول می کشد. اگر در Workflow، فقط یک درخواست اینچنینی وجود داشته باشد، می توانیم صبر کنیم، اما اگر تعداد این مدل درخواست ها افزایش پیدا کند چه باید کرد؟ در بعضی مواقع اگر تعداد آنها بیش از حد باشید، ممکن است اجرای سیستم گردش کار با مشکل مواجه شود.

به نظر شما راه حل مشکل بالا چیست؟ آیا می توان برای هر درخواست یک Thread جداگانه ایجاد کرد ...!؟

اما initialize کردن یا راه اندازی اولیه Threadها بسیار هزینه بر است. بعنوان مثال به ازای هر thread به 1 مگابایت فضا نیاز داریم ...! خوب ظاهراً راه حل بالا نمی تواند گزینه خوبی باشد. پس راه حل چیست؟

در این قسمت از آموزش Workflow قصد داریم اکتیویتی ای ایجاد کنیم که بصورت غیرهمزمان یا asynchronously، فراخوانی می شود. در واقع راه حل مشکل بالا، ساخت یک اکتیویتی سفارشی با استفاده از کلاس AsyncCodeActivity است.


مراحل پیاده سازی سیستم گردش فرم

 پروژه گردش کار TestAsyncHttpGetWF شامل مراحل زير است:

  1. اضافه کردن فایل InputMessage.cs
  2. ايجاد و طراحي Workflow
  3. اجراي Workflow
  4. پروژه ي گردش کار TestAsyncHttpGetWF چگونه عمل مي کند؟

اضافه کردن فایل AsyncHttpGet.cs

در پروژه ActivityLibrary، یک فایل جدید با نام AsyncHttpGet.cs ایجاد نمایید و کدهای زیر را در آن قرار دهید:

AsyncHttpGet.cs

using System;
using System.Activities;
using System.Net;
using System.IO;
public class AsyncHttpGet : AsyncCodeActivity
{
    public InArgument Uri { get; set; }
    protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)
    {
        WebRequest request = HttpWebRequest.Create(this.Uri.Get(context));
        context.UserState = request;
        return request.BeginGetResponse(callback, state);
    }
    protected override string EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
    {
        WebRequest request = context.UserState as WebRequest;
        using (WebResponse response = request.EndGetResponse(result))
        {
            using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            {
                return reader.ReadToEnd();
            }
        }
    }
}

 حالا پروژه را Build کنید تا اکتیویتی سفارشی ما یعنی AsyncHttpGet در پنل Toolbox ظاهر شود.


ايجاد و طراحي Workflow

در پروژه WorkflowConsoleApp  یک Workflow جدید با نام TestAsyncHttpGetWF.xaml اضافه نمایید و برای طراحی Workflow مراحل زیر را طی نمایید:

  1. از پنل Toolbox، اکتيويتي Sequence را بداخل صفحه طراحی گردش کار بکشيد و مطابق تصویر زیر، متغیر resultVar را تعریف نمایید.
  2. یک اکتیویتی WriteLine اضافه کنید و خصوصیت Text آنرا با "... Start" تنظیم نمایید.
  3. از پنل Toolbox، اکتيويتي AsyncHttpGet  را در زیر اکتیویتی WriteLine قرار دهید و مطابق تصویر زیر آنرا تنظیم نمایید.
  4. در آخر دو اکتیویتی WriteLine دیگر اضافه کنید و خصوصیت Text آنها را مطابق زیر تنظیم نمایید.


اجراي Workflow

براي اجراي Workflow، فایل Program.cs را بصورت زیر تغییر داده و دکمه هاي ميانبر Ctrl+F5 را فشار دهيد:

Program.cs

Activity workflow1 = new TestAsyncHttpGetWF();            
WorkflowInvoker.Invoke(workflow1);

همانطور که در تصویر زیر مشاهده می کنید، چاپ شدن متن "Workflow is still running" ثابت می کند که Workflow بخاطر درخواست HTTP ما Block نشده است و در واقع اجرای اکتیویتی AsyncHttpGet بصورت غیرهمزمان انجام شده است:


پروژه ي گردش کار TestAsyncHttpGetWF چگونه عمل مي کند؟

در سیستم گردش کار بالا، اکتیویتی Sequence در ابتدا متد BeginExecute مربوط به اکتیویتی سفارشی ما یعنی AsyncHttpGet را فراخوانی می کند و پارامتر "Uri" و "یک تابع callback" را به آن پاس می دهد. تابع callback زمانی که اجرای متد BeginExecute بصورت کامل پایان یافت، اجرا خواهد شد و در واقع ادامه اجرای برنامه به تابع callback منتقل می شود. 

به این ترتیب در یک زمان، هم Workflow  و هم درخواست HTTP بصورت غیرهمزمان اجرا می شوند. زمانی که پاسخ درخواست HTTP آماده شد، تابع callback بصورت اتوماتیک اجرا می شود.

حالا Workflow می داند که باید متد EndExecute مربوط به  اکتیویتی سفارشی ما یعنی AsyncHttpGet را فراخوانی کند.

تمامی محصولات و خدمات این وبسایت، حسب مورد دارای مجوزهای لازم از مراجع مربوطه می‌باشند و فعالیت‌های این سایت تابع قوانین و مقررات جمهوری اسلامی ایران است.
logo-samandehi مجوز نشر دیجیتال از وزرات فرهنگ و ارشاد اسلامی پرداخت آنلاین -  بانک ملت معرفی بیاموز در شبکه سه