اتصال Azure Functions بـ Azure Storage باستخدام أدوات سطر الأوامر

في هذه المقالة، يمكنك دمج قائمة انتظار Azure Storage مع حساب الدالة والتخزين الذي أنشأته في مقالة «Quickstart» السابقة. يمكنك تحقيق هذا التكامل باستخدام ربط الإخراج الذي يكتب البيانات من طلب HTTP إلى رسالة في قائمة الانتظار. لا يكلف إكمال هذه المقالة أي تكاليف إضافية تتجاوز السنتات القليلة بالدولار الأمريكي من مقال «Quickstart» السابقة. راجع مشغلات Azure Functions ومفاهيم الربط لمعرفة المزيد.

تكوين البيئة المحلية الخاصة بك

قبل البدء، يجب عليك إكمال المقالة Quickstart: إنشاء مشروع Azure Function من سطر الأوامر. إذا قمت بالفعل بتنظيف الموارد في نهاية هذه المقالة، فانتقل إلى الخطوات مرة أخرى لإعادة إنشاء تطبيق الدالة والموارد ذات الصلة في Azure.

قبل البدء، يجب عليك إكمال المقالة Quickstart: إنشاء مشروع Azure Function من سطر الأوامر. إذا قمت بالفعل بتنظيف الموارد في نهاية هذه المقالة، فانتقل إلى الخطوات مرة أخرى لإعادة إنشاء تطبيق الدالة والموارد ذات الصلة في Azure.

قبل البدء، يجب عليك إكمال المقالة Quickstart: إنشاء مشروع Azure Function من سطر الأوامر. إذا قمت بالفعل بتنظيف الموارد في نهاية هذه المقالة، فانتقل إلى الخطوات مرة أخرى لإعادة إنشاء تطبيق الدالة والموارد ذات الصلة في Azure.

قبل البدء، يجب عليك إكمال المقالة Quickstart: إنشاء مشروع Azure Function من سطر الأوامر. إذا قمت بالفعل بتنظيف الموارد في نهاية هذه المقالة، فانتقل إلى الخطوات مرة أخرى لإعادة إنشاء تطبيق الدالة والموارد ذات الصلة في Azure.

قبل البدء، يجب عليك إكمال المقالة Quickstart: إنشاء مشروع Azure Function من سطر الأوامر. إذا قمت بالفعل بتنظيف الموارد في نهاية هذه المقالة، فانتقل إلى الخطوات مرة أخرى لإعادة إنشاء تطبيق الدالة والموارد ذات الصلة في Azure.

قبل البدء، يجب عليك إكمال المقالة Quickstart: إنشاء مشروع Azure Function من سطر الأوامر. إذا قمت بالفعل بتنظيف الموارد في نهاية هذه المقالة، فانتقل إلى الخطوات مرة أخرى لإعادة إنشاء تطبيق الدالة والموارد ذات الصلة في Azure.

استرجع سلسلة اتصال Azure Storage

في وقت سابق، قمت بإنشاء حساب تخزين Azure لاستخدامه من قبل تطبيق الدالة. يتم تخزين سلسلة الاتصال لهذا الحساب بشكل آمن في إعدادات التطبيق في Azure. عن طريق تحميل الإعداد في الملف local.settings.json، يمكنك استخدام اتصال الكتابة هذا إلى قائمة انتظار تخزين في نفس الحساب عند تشغيل الدالة محليًا.

  1. من جذر المشروع، قم بتشغيل الأمر التالي، لاستبدال <APP_NAME> باسم تطبيق الدالة الخاص بك من الخطوة السابقة. سيقوم هذا الأمر بالكتابة فوق أي قيم موجودة في الملف.

    func azure functionapp fetch-app-settings <APP_NAME>
    
  2. افتح ملف local.settings.json وحدد موقع القيمة بالاسم AzureWebJobsStorage، وهي سلسلة اتصال حساب التخزين. يمكنك استخدام الاسم AzureWebJobsStorage وسلسلة الاتصال في أقسام أخرى بهذه المقالة.

هام

لأن ملف local.settings.json يحتوي على أسرار تم تحميلها من Azure، واستبعد دائمًا هذا الملف من عنصر التحكم المصدر. الملف .gitignore الذي تم إنشاؤه مع مشروع دوال محلية يستبعد الملف بشكل افتراضي.

تسجيل ملحقات الربط

باستثناء HTTP والمشغلات الموقتة، يتم تنفيذ الارتباطات كحزم ملحقة. قم بتشغيل الأمر التالي dotnet add package في نافذة المحطة الطرفية لإضافة حزمة ملحق التخزين إلى مشروعك.

dotnet add package Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues --prerelease

الآن، يمكنك إضافة ارتباط مخرجات التخزين إلى مشروعك.

إضافة تعريف ربط الإخراج إلى الوظيفة

على الرغم من أن الدالة يمكن أن يكون لها مشغل واحد فقط، فإنه يمكن أن تحتوي على روابط إدخال وإخراج متعددة، والتي تتيح الاتصال بخدمات وموارد Azure الأخرى دون كتابة رمز التكامل المخصص.

عند استخدام نموذج برمجة Node.js v4، يتم تعريف سمات الربط مباشرة في ملف ./src/functions/HttpExample.js . من التشغيل السريع السابق، يحتوي الملف بالفعل على ربط HTTP معرف بواسطة app.http الأسلوب .

const { app } = require('@azure/functions');

app.http('httpTrigger', {
  methods: ['GET', 'POST'],
  authLevel: 'anonymous',
  handler: async (request, context) => {
    try {
      context.log(`Http function processed request for url "${request.url}"`);

      const name = request.query.get('name') || (await request.text());
      context.log(`Name: ${name}`);

      if (!name) {
        return { status: 404, body: 'Not Found' };
      }

      return { body: `Hello, ${name}!` };
    } catch (error) {
      context.log(`Error: ${error}`);
      return { status: 500, body: 'Internal Server Error' };
    }
  },
});

عند استخدام نموذج برمجة Node.js v4، يتم تعريف سمات الربط مباشرة في ملف ./src/functions/HttpExample.js . من التشغيل السريع السابق، يحتوي الملف بالفعل على ربط HTTP معرف بواسطة app.http الأسلوب .

import {
  app,
  HttpRequest,
  HttpResponseInit,
  InvocationContext,
} from '@azure/functions';

export async function httpTrigger1(
  request: HttpRequest,
  context: InvocationContext,
): Promise<HttpResponseInit> {
  context.log(`Http function processed request for url "${request.url}"`);

  const name = request.query.get('name') || (await request.text()) || 'world';

  return { body: `Hello, ${name}!` };
}

app.http('httpTrigger1', {
  methods: ['GET', 'POST'],
  authLevel: 'anonymous',
  handler: httpTrigger1,
});

الإعلان عن هذه الارتباطات في ملف function.json في مجلد الوظيفة. من التشغيل السريع السابق، يحتوي ملف function.json في المجلد HttpExample على ارتباطين في المجموعة bindings:

عند استخدام نموذج برمجة Python v2، يتم تعريف سمات الربط مباشرة في ملف function_app.py كمزخرفات. من التشغيل السريع السابق، يحتوي ملف function_app.py بالفعل على ربط واحد يستند إلى مصمم الديكور:

import azure.functions as func
import logging

app = func.FunctionApp()

@app.function_name(name="HttpTrigger1")
@app.route(route="hello", auth_level=func.AuthLevel.ANONYMOUS)

route يضيف مصمم الديكور ربط HttpTrigger وHttpOutput إلى الدالة، ما يتيح تشغيل الدالة الخاصة بك عندما تصل طلبات http إلى المسار المحدد.

للكتابة إلى قائمة انتظار Azure Storage من هذه الدالة queue_output ، أضف مصمم الديكور إلى التعليمات البرمجية للدالة:

@app.queue_output(arg_name="msg", queue_name="outqueue", connection="AzureWebJobsStorage")

في مصمم الديكور، arg_name يحدد معلمة الربط المشار إليها في التعليمات البرمجية الخاصة بك، queue_name وهو اسم قائمة الانتظار التي يكتب الربط إليها، وهو connection اسم إعداد تطبيق يحتوي على سلسلة الاتصال لحساب التخزين. في التشغيل السريع، يمكنك استخدام نفس حساب التخزين مثل تطبيق الوظائف، الموجود في AzureWebJobsStorage الإعداد (من ملف local.settings.json ). queue_name عندما لا يكون موجودا، يقوم الربط بإنشائه عند الاستخدام الأول.

"bindings": [
  {
    "authLevel": "function",
    "type": "httpTrigger",
    "direction": "in",
    "name": "Request",
    "methods": [
      "get",
      "post"
    ]
  },
  {
    "type": "http",
    "direction": "out",
    "name": "Response"
  }
]

للكتابة إلى قائمة انتظار Azure Storage:

  • إضافة خاصية extraOutputs إلى تكوين الربط

    {
        methods: ['GET', 'POST'],
        extraOutputs: [sendToQueue], // add output binding to HTTP trigger
        authLevel: 'anonymous',
        handler: () => {}
    }
    
  • إضافة دالة output.storageQueue فوق app.http الاستدعاء

    const sendToQueue: StorageQueueOutput = output.storageQueue({
      queueName: 'outqueue',
      connection: 'AzureWebJobsStorage',
    });
    

يسمى الربط الثاني في المجموعة res. هذا الرابط http عبارة عن ربط ناتج (out) يُستخدم لكتابة استجابة HTTP.

للكتابة في قائمة Azure Storage من هذه الوظيفة، يجب إضافة out ربط من النوع queue بالاسم msg، كما هو موضح في الكود أدناه:

    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "Request",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "Response"
    },
    {
      "type": "queue",
      "direction": "out",
      "name": "msg",
      "queueName": "outqueue",
      "connection": "AzureWebJobsStorage"
    }
  ]
}

queue بالنسبة لنوع ما، يجب تحديد اسم قائمة الانتظار في queueName وتوفير اسم اتصال Azure Storage (من ملف local.settings.json) في connection.

في أحد مشروعات C#، يتم تعريف عمليات الربط كسمات ربط على أسلوب الدالة. تعتمد التعريفات المحددة على ما إذا كان تطبيقك يعمل قيد المعالجة (مكتبة فئة C#) أو في عملية عامل معزولة.

افتح ملف المشروع HttpExample.cs وأضف الفئة التالية MultiResponse:

public class MultiResponse
{
    [QueueOutput("outqueue",Connection = "AzureWebJobsStorage")]
    public string[] Messages { get; set; }
    public HttpResponseData HttpResponse { get; set; }
}

الفئة MultiResponse تسمح لك بالكتابة إلى قائمة انتظار تخزين مسماة outqueue ورسالة نجاح HTTP. يمكن إرسال رسائل متعددة إلى قائمة الانتظار لأن السمة QueueOutput يتم تطبيقها على صفيف سلسلة.

الخاصية Connection تعين سلسلة الاتصال لحساب التخزين. في هذه الحالة، يمكنك حذف Connection لأنك تستخدم حساب التخزين الافتراضي بالفعل.

في مشروع Java، يتم تعريف الارتباطات كتعليقات توضيحية ملزمة بخصوص أسلوب الدالة. يتم إنشاء ملف function.json تلقائيًا بناءً على هذه التعليقات التوضيحية.

استعرض للوصول إلى موقع رمز الدالة الخاص بك ضمن src/main/java، ثم افتح ملف مشروع Function.java، وأضف المعلمة التالية إلى تعريف الأسلوب run:

@QueueOutput(name = "msg", queueName = "outqueue", connection = "AzureWebJobsStorage") OutputBinding<String> msg

المعلمة msg هي من النوع OutputBinding<T>، والذي يمثل مجموعة من السلاسل. هذه السلاسل تكتب كرسائل إلى بيانات الإخراج عندما تكتمل الدالة. في هذه الحالة، الإخراج عبارة عن قائمة انتظار تخزين مسماة outqueue. يتم تعيين سلسلة الاتصال لحساب التخزين حسب أسلوب connection. يمكنك تمرير إعداد التطبيق الذي يحتوي على سلسلة اتصال حساب التخزين، بدلا من تمرير سلسلة الاتصال نفسها.

يجب أن يبدو تعريف الأسلوب run الآن مثل المثال التالي:

@FunctionName("HttpTrigger-Java")
public HttpResponseMessage run(
        @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.FUNCTION)  
        HttpRequestMessage<Optional<String>> request, 
        @QueueOutput(name = "msg", queueName = "outqueue", connection = "AzureWebJobsStorage") 
        OutputBinding<String> msg, final ExecutionContext context) {
    ...
}

لمزيد من المعلومات حول تفاصيل عمليات الربط، راجع مفاهيم مشغلات Azure Functions وعمليات ربط ووتكوين إخراج قائمة الانتظار.

إضافة التعليمات البرمجية لاستخدام ربط الإخراج

مع تحديد ربط قائمة الانتظار، يمكنك الآن تحديث وظيفتك لتلقي معلمة الإخراج msg وكتابة الرسائل إلى قائمة الانتظار.

قم بتحديث HttpExample\function_app.py لمطابقة التعليمات البرمجية التالية، وأضف المعلمة msg إلى تعريف الدالة وضمن msg.set(name) العبارة if name: :

import azure.functions as func
import logging

app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS)

@app.route(route="HttpExample")
@app.queue_output(arg_name="msg", queue_name="outqueue", connection="AzureWebJobsStorage")
def HttpExample(req: func.HttpRequest, msg: func.Out [func.QueueMessage]) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    name = req.params.get('name')
    if not name:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            name = req_body.get('name')

    if name:
        msg.set(name)
        return func.HttpResponse(f"Hello, {name}. This HTTP triggered function executed successfully.")
    else:
        return func.HttpResponse(
             "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.",
             status_code=200
        )

msg المعلمة هي مثيل ل azure.functions.Out class. يكتب الأسلوب set رسالة سلسلة إلى قائمة الانتظار. في هذه الحالة، يتم name تمريرها إلى الدالة في سلسلة استعلام URL.

أضف التعليمات البرمجية التي تستخدم كائن ربط الإخراج لإنشاء context.extraOutputs رسالة قائمة انتظار. أضف هذه التعليمة البرمجية قبل عبارة الإرجاع.

context.extraOutputs.set(sendToQueue, [msg]);

عند هذه النقطة، يمكن أن تبدو الدالة كما يلي:

const { app, output } = require('@azure/functions');

const sendToQueue = output.storageQueue({
  queueName: 'outqueue',
  connection: 'AzureWebJobsStorage',
});

app.http('HttpExample', {
  methods: ['GET', 'POST'],
  authLevel: 'anonymous',
  extraOutputs: [sendToQueue],
  handler: async (request, context) => {
    try {
      context.log(`Http function processed request for url "${request.url}"`);

      const name = request.query.get('name') || (await request.text());
      context.log(`Name: ${name}`);

      if (name) {
        const msg = `Name passed to the function ${name}`;
        context.extraOutputs.set(sendToQueue, [msg]);
        return { body: msg };
      } else {
        context.log('Missing required data');
        return { status: 404, body: 'Missing required data' };
      }
    } catch (error) {
      context.log(`Error: ${error}`);
      return { status: 500, body: 'Internal Server Error' };
    }
  },
});

أضف التعليمات البرمجية التي تستخدم كائن ربط الإخراج لإنشاء context.extraOutputs رسالة قائمة انتظار. أضف هذه التعليمة البرمجية قبل عبارة الإرجاع.

context.extraOutputs.set(sendToQueue, [msg]);

عند هذه النقطة، يمكن أن تبدو الدالة كما يلي:

import {
  app,
  output,
  HttpRequest,
  HttpResponseInit,
  InvocationContext,
  StorageQueueOutput,
} from '@azure/functions';

const sendToQueue: StorageQueueOutput = output.storageQueue({
  queueName: 'outqueue',
  connection: 'AzureWebJobsStorage',
});

export async function HttpExample(
  request: HttpRequest,
  context: InvocationContext,
): Promise<HttpResponseInit> {
  try {
    context.log(`Http function processed request for url "${request.url}"`);

    const name = request.query.get('name') || (await request.text());
    context.log(`Name: ${name}`);

    if (name) {
      const msg = `Name passed to the function ${name}`;
      context.extraOutputs.set(sendToQueue, [msg]);
      return { body: msg };
    } else {
      context.log('Missing required data');
      return { status: 404, body: 'Missing required data' };
    }
  } catch (error) {
    context.log(`Error: ${error}`);
    return { status: 500, body: 'Internal Server Error' };
  }
}

app.http('HttpExample', {
  methods: ['GET', 'POST'],
  authLevel: 'anonymous',
  handler: HttpExample,
});

إضافة التعليمات البرمجية التي تستخدم Push-OutputBinding cmdlet لكتابة نص إلى قائمة الانتظار باستخدام ربط الإخراج msg. إضافة هذه التعليمات البرمجية قبل تعيين حالة «موافق» في عبارة if.

$outputMsg = $name
Push-OutputBinding -name msg -Value $outputMsg

عند هذه النقطة، يجب أن تبدو دالتك كما يلي:

using namespace System.Net

# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)

# Write to the Azure Functions log stream.
Write-Host "PowerShell HTTP trigger function processed a request."

# Interact with query parameters or the body of the request.
$name = $Request.Query.Name
if (-not $name) {
    $name = $Request.Body.Name
}

if ($name) {
    # Write the $name value to the queue, 
    # which is the name passed to the function.
    $outputMsg = $name
    Push-OutputBinding -name msg -Value $outputMsg

    $status = [HttpStatusCode]::OK
    $body = "Hello $name"
}
else {
    $status = [HttpStatusCode]::BadRequest
    $body = "Please pass a name on the query string or in the request body."
}

# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = $status
    Body = $body
})

استبدال الفئة الحالية HttpExample بالتعليمات البرمجية التالية:

    [Function("HttpExample")]
    public static MultiResponse Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestData req,
        FunctionContext executionContext)
    {
        var logger = executionContext.GetLogger("HttpExample");
        logger.LogInformation("C# HTTP trigger function processed a request.");

        var message = "Welcome to Azure Functions!";

        var response = req.CreateResponse(HttpStatusCode.OK);
        response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
        response.WriteString(message);

        // Return a response to both HTTP trigger and storage output binding.
        return new MultiResponse()
        {
            // Write a single message.
            Messages = new string[] { message },
            HttpResponse = response
        };
    }
}

الآن، يمكنك استخدام المعلمة الجديدة msg للكتابة إلى ربط الإخراج من التعليمات البرمجية للدالة. أضف السطر التالي من التعليمات البرمجية قبل استجابة النجاح لإضافة قيمة name إلى msg ربط الإخراج.

msg.setValue(name);

عند استخدام ربط إخراج، لا يلزم استخدام تعليمة Azure Storage SDK البرمجية للمصادقة، أو الحصول على مرجع قائمة انتظار، أو كتابة البيانات. يعمل وقت تشغيل الدوال، وربط إخراج قائمة الانتظار على أداء تلك المهام من أجلك.

يجب أن يبدو أسلوب run لديك الآن كالمثال التالي:

public HttpResponseMessage run(
        @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) 
        HttpRequestMessage<Optional<String>> request, 
        @QueueOutput(name = "msg", queueName = "outqueue", 
        connection = "AzureWebJobsStorage") OutputBinding<String> msg, 
        final ExecutionContext context) {
    context.getLogger().info("Java HTTP trigger processed a request.");

    // Parse query parameter
    String query = request.getQueryParameters().get("name");
    String name = request.getBody().orElse(query);

    if (name == null) {
        return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
        .body("Please pass a name on the query string or in the request body").build();
    } else {
        // Write the name to the message queue. 
        msg.setValue(name);

        return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
    }
}

تحديث الاختبارات

لأن النموذج الأصلي أيضًا ينشئ مجموعة من الاختبارات، فأنت تحتاج إلى تحديث هذه الاختبارات لمعالجة msg المعلمة run الجديدة في توقيع الأسلوب.

تصفح للوصول إلى موقع التعليمات البرمجية للاختبار الخاص بك في src/main/java، ثم افتح ملف مشروع "Function.java"، واستبدل سطر التعليمات البرمجية أسفل //Invoke بالتعليمات البرمجية التالية:

@SuppressWarnings("unchecked")
final OutputBinding<String> msg = (OutputBinding<String>)mock(OutputBinding.class);
final HttpResponseMessage ret = new Function().run(req, msg, context);

لاحظ أنك لست بحاجة إلى كتابة أي تعليمة برمجية للمصادقة أو الحصول على مرجع قائمة انتظار أو كتابة البيانات. يتم التعامل مع جميع مهام التكامل هذه بشكل ملائم في وقت تشغيل Azure Functions وربط إخراج قائمة الانتظار.

تشغيل الدالة محليًا

  1. شغل الدالة عن طريق بدء تشغيل مضيف وقت تشغيل دوال Azure المحلي من المجلد LocalFunctionProj.

    func start
    

    قرب نهاية الإخراج، يجب أن تظهر الأسطر التالية:

    لقطة شاشة لإخراج نافذة المحطة الطرفية عند تشغيل الدالة محليا.

    إشعار

    إذا لم يظهر HttpExample كما هو موضح أعلاه، فمن المحتمل أن تكون قد بدأت المضيف من خارج المجلد الجذر للمشروع. في هذه الحالة، استخدم Ctrl+C لإيقاف المضيف، انتقل إلى المجلد الجذر للمشروع، وتشغيل الأمر السابق مرة أخرى.

  2. انسخ عنوان URL لدالة HTTP من هذا الإخراج إلى مستعرض وألحق سلسلة ?name=<YOUR_NAME>الاستعلام ، مما يجعل عنوان URL الكامل مثل http://localhost:7071/api/HttpExample?name=Functions. يجب أن يعرض المستعرض رسالة استجابة التي تعكس قيمة سلسلة الاستعلام. تُظهر المحطة الطرفية التي بدأت فيها مشروعك أيضًا إخراج السجل أثناء تقديم الطلبات.

  3. عند الانتهاء، اضغط على Ctrl + C واكتب y لإيقاف مضيف الوظائف.

تلميح

في أثناء بدء التشغيل، يقوم المضيف بتنزيل وتثبيت ملحق ربط التخزين وملحقات ربط Microsoft الأخرى. يحدث هذا التثبيت لأنه تم تمكين ملحقات الربط بشكل افتراضي في ملف host.json مع الخصائص التالية:

{
    "version": "2.0",
    "extensionBundle": {
        "id": "Microsoft.Azure.Functions.ExtensionBundle",
        "version": "[1.*, 2.0.0)"
    }
}

إذا واجهت أي أخطاء تتعلق بملحقات الربط، فتحقق من أن الخصائص أعلاه موجودة في الملفhost.json.

عرض الرسالة في قائمة انتظار Azure Storage

يمكنك عرض قائمة الانتظار في ⁧⁩مدخل Microsoft Azure⁧⁩ أو في مستكشف تخزين ⁧⁩Microsoft Azure⁧⁩. يمكنك أيضًا عرض قائمة الانتظار في CLI Azure كما هو موضح في الخطوات التالية:

  1. افتح ملف local.setting.json الخاص بمشروع الدالة وانسخ قيمة سلسلة الاتصال. في نافذة طرفية أو أمر، قم بتشغيل الأمر التالي لإنشاء متغير بيئة يُسمى ⁧AZURE_STORAGE_CONNECTION_STRING⁩، والصق سلسلة الاتصال المحددة بدلاً من ⁧<MY_CONNECTION_STRING>⁩. (يعني متغير البيئة هذا أنك لا تحتاج إلى توفير سلسلة الاتصال لكل أمر لاحق باستخدام الوسيطة --connection-string .)

    export AZURE_STORAGE_CONNECTION_STRING="<MY_CONNECTION_STRING>"
    
  2. (اختياري) az storage queue list استخدم الأمر لعرض قوائم انتظار التخزين في حسابك. يجب أن يتضمن الإخراج من هذا الأمر قائمة انتظار تُسمى ⁧outqueue⁩، والتي تم إنشاؤها عند كتابة الدالة لرسالتها الأولى إلى قائمة الانتظار تلك.

    az storage queue list --output tsv
    
  3. استخدم الأمر ⁧⁩⁧az storage message get⁩⁧⁩ لقراءة الرسالة من قائمة الانتظار هذه، والتي يجب أن تكون القيمة التي استخدمتها عند اختبار الدالة في وقت سابق. يقرأ الأمر الرسالة الأولى ثم يزيلها من قائمة الانتظار.

    echo `echo $(az storage message get --queue-name outqueue -o tsv --query '[].{Message:content}') | base64 --decode`
    

    نظرا لأن نص الرسالة مخزن بترميز base64، يجب فك ترميز الرسالة قبل عرضها. بعد تنفيذ az storage message get، تتم إزالة الرسالة من قائمة الانتظار. إذا كانت هناك رسالة واحدة فقط في outqueue، فلن تسترد رسالة عند تشغيل هذا الأمر مرة ثانية وبدلا من ذلك تحصل على خطأ.

إعادة نشر المشروع إلى Azure

الآن بعد أن تحققت محليًا من أن الدالة كتبت رسالة إلى قائمة انتظار Azure Storage، يمكنك إعادة نشر مشروعك لتحديث نقطة النهاية التي تعمل على Azure.

في المجلد LocalFunctionsProj، استخدم الأمر func azure functionapp publish لإعادة نشر المشروع، مع استبدال<APP_NAME> باسم التطبيق لديك.

func azure functionapp publish <APP_NAME>

في مجلد المشروع المحلي، استخدم الأمر "Maven" التالي لإعادة نشر مشروعك:

mvn azure-functions:deploy

التحقق في Azure

  1. كما في Quickstart السابقة، استخدم متصفحًا أو CURL لاختبار الدالة المعاد نشرها.

    نسخ URL Invoke الكاملة المعروضة في نتيجة أمر النشر في شريط عناوين المتصفح، مع إرفاق معلمة الاستعلام&name=Functions. يجب أن يعرض المتصفح النتيجة نفسها كما هو الحال عند تشغيل الدالة محلياً.

  2. افحص قائمة انتظار Storage مرة أخرى، كما هو موضح في القسم السابق، للتحقق من أنها تحتوي على الرسالة الجديدة المكتوبة إلى قائمة الانتظار.

تنظيف الموارد

وبعد الانتهاء، استخدم الأمر التالي لحذف مجموعة الموارد وكافة الموارد المضمنة لتجنب تكبد المزيد من التكاليف.

az group delete --name AzureFunctionsQuickstart-rg

الخطوات التالية

لقد قمت بتحديث الدالة التي تم تشغيلها من HTTP لكتابة البيانات إلى قائمة انتظار التخزين. يمكنك الآن معرفة المزيد حول تطوير الدوال من سطر الأوامر باستخدام Core Tools وAzure CLI: