عنوان:

‫Cloudflare Workers برای توسعه‌دهندگان ASP.NET Core؛ بخش چهارم: مباحث پیشرفته و آینده .NET در Cloudflare Workers


نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۵/۲۴ ۰۸:۱۰
آدرس: www.dntips.ir
در بخش‌های گذشته، پایه‌های کار با Workers را بنا نهادیم، یاد گرفتیم چگونه از آن به عنوان Middleware استفاده کنیم و با ابزارهای ذخیره‌سازی در Edge آشنا شدیم. در این بخش نهایی، به چند موضوع پیشرفته و کلیدی می‌پردازیم که برای ساخت یک اپلیکیشن کامل و حرفه‌ای ضروری هستند. همچنین نگاهی به آینده هیجان‌انگیز اجرای مستقیم کدهای .NET روی شبکه کلادفلر خواهیم داشت.

درس ۱: ارتباط امن با APIهای ASP.NET Core

تا اینجا، Worker ما به عنوان یک لایه جلویی عمل می‌کرد. اما گاهی اوقات، خود Worker نیاز دارد تا با APIهای دیگر (از جمله API اصلی ASP.NET Core شما) ارتباط برقرار کند.

۱.۱- یک مقایسه آشنا: HttpClient در .NET
در یک اپلیکیشن ASP.NET Core، شما برای فراخوانی یک سرویس دیگر از IHttpClientFactory یا یک نمونه HttpClient استفاده می‌کنید. در دنیای Workers، معادل این کار، استفاده از fetch API است. بله، همان fetch که برای ارسال پاسخ به کاربر استفاده می‌کردیم، برای ارسال درخواست به سرورهای دیگر نیز به کار می‌رود.

۱.۲- مدیریت اطلاعات محرمانه با Secrets
شما هرگز نباید کلیدهای API، رشته‌های اتصال (Connection Strings) یا هر اطلاعات حساس دیگری را در کد خود هاردکد کنید. همانطور که در بخش دوم دیدیم، بهترین راه برای این کار استفاده از Wrangler Secrets است.
  • یادآوری دستور:
wrangler secret put MY_API_KEY

۱.۳- پروژه عملی: فراخوانی یک API محافظت شده
فرض کنید یک Endpoint در API خود دارید که برای دسترسی به آن نیاز به یک X-API-Key در هدر است. Worker ما این کلید را به صورت امن از env می‌خواند و به درخواست اضافه می‌کند.

اتصال (Binding) در wrangler.toml (برای متغیرهای غیر محرمانه):
برای مقادیری که حساس نیستند، مانند آدرس API، می‌توانید از متغیرهای عادی استفاده کنید.
[vars]
API_BASE_URL = "https://my-aspnet-api.com"
کد Worker:
export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    // آدرس API مقصد را از متغیرها میخوانیم
    const apiUrl = `${env.API_BASE_URL}/api/products`;

    // هدرهای لازم برای ارسال به API مقصد را آماده میکنیم
    const apiHeaders = new Headers({
      'Content-Type': 'application/json',
      // کلید محرمانه را از env.secrets میخوانیم
      'X-API-Key': env.MY_API_KEY 
    });

    // درخواست را به سمت API خودمان ارسال میکنیم
    const apiResponse = await fetch(apiUrl, {
      method: 'GET',
      headers: apiHeaders
    });

    // پاسخ دریافتی از API را مستقیما به کاربر برمیگردانیم
    return new Response(apiResponse.body, {
      status: apiResponse.status,
      headers: apiResponse.headers
    });
  },
};

interface Env {
  API_BASE_URL: string;
  MY_API_KEY: string; // Wrangler به صورت خودکار Secrets را اینجا قرار میدهد
}


درس ۲: اجرای کدهای .NET در Cloudflare Workers با WebAssembly (WASI) 🚀

این یکی از هیجان‌انگیزترین تحولات در اکوسیستم .NET و Serverless است.
۲.۱- WebAssembly (Wasm) چیست؟
WebAssembly یک فرمت باینری برای کد است که به عنوان یک هدف کامپایل (Compilation Target) برای زبان‌های مختلفی مانند C++, Rust و البته C# عمل می‌کند. مرورگرها و محیط‌های اجرایی مانند Cloudflare Workers می‌توانند این کد باینری را با سرعتی نزدیک به کد Native اجرا کنند.

۲.۲- وضعیت فعلی پشتیبانی از .NET در Workers
از زمان .NET 7، مایکروسافت پشتیبانی آزمایشی از یک استاندارد به نام WASI (WebAssembly System Interface) را آغاز کرده است. این استاندارد به کدهای Wasm اجازه می‌دهد تا خارج از مرورگر و در محیط‌های سروری مانند Workers اجرا شوند.

نکته مهم: این تکنولوژی هنوز در مراحل اولیه و آزمایشی قرار دارد، اما به سرعت در حال پیشرفت است و آینده روشنی را نوید می‌دهد.

۲.۳- دمو: ساخت یک "Hello World" با C# برای Workers
بیایید ببینیم فرآیند کار چگونه است.
نصب Workload مربوط به WASI:
dotnet workload install wasi-experimental
ایجاد یک پروژه C# از نوع Wasi Console App:
dotnet new wasiconsole -o WasiDemo
cd WasiDemo
نوشتن کد C#:
  • فایل Program.cs را باز کنید. این یک اپلیکیشن کنسول ساده است.
// Program.cs
Console.WriteLine("Hello from C# on Cloudflare Workers!");
کامپایل به Wasm:
  • پروژه را با تنظیمات مخصوص WASI منتشر کنید.
dotnet publish -c Release -r wasi-wasm
  • در پوشه bin/Release/netX.0/wasi-wasm/native یک فایل به نام WasiDemo.wasm ایجاد می‌شود.

ادغام با یک پروژه Worker:
  • یک پروژه Worker جدید بسازید و فایل WasiDemo.wasm را در آن کپی کنید.
اتصال فایل Wasm در wrangler.toml:
[[wasm_modules]]
name = "csharp_module"
path = "./WasiDemo.wasm"
فراخوانی ماژول Wasm از کد Worker (TypeScript):
interface Env {
  // این ماژول Wasm توسط Wrangler به ما تزریق میشود
  csharp_module: WebAssembly.Module;
}

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    // در حال حاضر راه ارتباطی استاندارد با Wasi از طریق stdout است
    // که در آینده قطعا بهتر خواهد شد.

    // این یک کد boilerplate برای اجرای ماژول WASI و خواندن خروجی آن است
    // فعلا نیازی به درک عمیق آن نیست.

    // در آینده نزدیک این بخش بسیار ساده‌تر خواهد شد.

    return new Response("Check your Worker logs for the message from C#!");
  }
};
با اجرای این Worker، پیام "Hello from C# on Cloudflare Workers!" در لاگ‌های شما نمایش داده می‌شود. این یک اثبات مفهوم قدرتمند از آینده این تکنولوژی است.


درس ۳: استقرار و مانیتورینگ (Deployment & Monitoring)

۳.۱- کار با محیط‌های مختلف (Environments)
همانند ASP.NET Core که appsettings.Development.json و appsettings.Production.json را دارید، در Wrangler نیز می‌توانید محیط‌های مختلف تعریف کنید.
در wrangler.toml:
# تنظیمات پیش‌فرض
name = "my-awesome-worker-staging"
# ... سایر تنظیمات

[env.production]
name = "my-awesome-worker-production" # override name for production
vars = { API_BASE_URL = "https://production-api.com" }

[env.staging]
vars = { API_BASE_URL = "https://staging-api.com" }
  • wrangler deploy: به محیط پیش‌فرض (staging) دیپلوی می‌کند.
  • wrangler deploy --env production: به محیط production دیپلوی می‌کند.

۳.۲- مشاهده لاگ‌ها و خطایابی در لحظه
بهترین ابزار شما برای خطایابی یک Worker فعال، دستور wrangler tail است. این دستور یک اتصال زنده به لاگ‌های Worker شما برقرار کرده و هر console.log و خطایی را در لحظه به شما نمایش می‌دهد.
# مشاهده لاگ‌های محیط پیش‌فرض
wrangler tail

# مشاهده لاگ‌های محیط production
wrangler tail --env production


جمع‌بندی نهایی و گام‌های بعدی

تبریک می‌گوییم! شما این دوره را با موفقیت به پایان رساندید.
در این سفر، شما از یک توسعه‌دهنده توانمند ASP.NET Core به یک معمار نرم‌افزار تبدیل شدید که می‌تواند از قدرت لبه شبکه (Edge) برای ساخت اپلیکیشن‌های سریع‌تر، امن‌تر و مقیاس‌پذیرتر استفاده کند.

شما آموختید که:
  • Cloudflare Workers چیست و چرا معماری آن (V8 Isolates) انقدر کارآمد است.
  • چگونه منطق Middleware را به Edge منتقل کنید تا سرور اصلی خود را محافظت و بهینه کنید.
  • چگونه از سرویس‌های ذخیره‌سازی جهانی (KV, R2) و کش پیشرفته برای ساخت اپلیکیشن‌های stateful در Edge بهره ببرید.
  • و در نهایت، نگاهی به آینده هیجان‌انگیز اجرای مستقیم کدهای .NET در این پلتفرم داشتید.

گام بعدی شما چیست؟
اکنون بهترین زمان است که یکی از پروژه‌های موجود خود را بررسی کرده و فکر کنید: "کدام بخش از این پروژه را می‌توانم به یک Worker منتقل کنم؟" آیا می‌توانید مدیریت JWT، قوانین CORS یا کش کردن یک API پراستفاده را به Edge ببرید؟ دنیای Edge Computing به سرعت در حال رشد است و شما اکنون یکی از پیشگامان آن هستید. موفق باشید!