اتصال 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.WebJobs.Extensions.Storage 

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

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

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

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

"bindings": [
    {
        "authLevel": "function",
        "type": "httpTrigger",
        "direction": "in",
        "name": "req",
        "methods": [
            "get",
            "post"
        ]
    },
    {
        "type": "http",
        "direction": "out",
        "name": "res"
    }
]
"scriptFile": "__init__.py",
"bindings": [
    {
        "authLevel": "function",
        "type": "httpTrigger",
        "direction": "in",
        "name": "req",
        "methods": [
            "get",
            "post"
        ]
    },
    {
        "type": "http",
        "direction": "out",
        "name": "$return"
    }
"bindings": [
  {
    "authLevel": "function",
    "type": "httpTrigger",
    "direction": "in",
    "name": "Request",
    "methods": [
      "get",
      "post"
    ]
  },
  {
    "type": "http",
    "direction": "out",
    "name": "Response"
  }
]

يحتوي كل ارتباط على الأقل على نوع واتجاه واسم. في المثال أعلاه، يكون الربط الأول من النوع httpTrigger بالاتجاه in. بالنسبة إلى الاتجاه in، يحدد name اسم معلمة الإدخال التي تُرسل إلى الوظيفة عند استدعاء المشغل لها.

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

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

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

يكون الارتباط الثاني في المجموعة من النوع http بالاتجاه out، وفي هذه الحالة يشير name الخاص بـ $return إلى أن هذا الربط يستخدم قيمة إرجاع الدالة بدلاً من توفير معلمة إدخال.

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

"bindings": [
  {
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
      "get",
      "post"
    ]
  },
  {
    "type": "http",
    "direction": "out",
    "name": "$return"
  },
  {
    "type": "queue",
    "direction": "out",
    "name": "msg",
    "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"
    }
  ]
}

في هذه الحالة، يُغطى msg للدالة كوسيطة إخراج. بالنسبة لنوع queue، يجب أيضًا تحديد اسم القائمة في queueName وتقديم اسم اتصال Azure Storage (من local.settings.json) في connection.

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

فتح ملف المشروع HttpExample.cs وأضف المعلمة التالية إلى Run تعريف الأسلوب:

[Queue("outqueue"),StorageAccount("AzureWebJobsStorage")] ICollector<string> msg,

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

يجب أن يبدو تعريف أسلوب التشغيل الآن كما يلي:

[FunctionName("HttpExample")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, 
    [Queue("outqueue"),StorageAccount("AzureWebJobsStorage")] ICollector<string> msg, 
    ILogger log)

في مشروع 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\__init__.py لمطابقة التعليمة البرمجية التالية، إضافة المعلمة إلى تعريف الدالة msg وتحت msg.set(name) العبارة if name: .

import logging

import azure.functions as func


def main(req: func.HttpRequest, msg: func.Out[func.QueueMessage]) -> str:

    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}!")
    else:
        return func.HttpResponse(
            "Please pass a name on the query string or in the request body",
            status_code=400
        )

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

أضف الرمز الذي يستخدم msg كائن توثيق الإخراج context.bindings لإنشاء رسالة قائمة انتظار. إضافة هذا الرمز قبل عبارة context.res.

// Add a message to the Storage queue,
// which is the name passed to the function.
context.bindings.msg = (req.query.name || req.body.name);

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

module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    if (req.query.name || (req.body && req.body.name)) {
        // Add a message to the Storage queue,
        // which is the name passed to the function.
        context.bindings.msg = (req.query.name || req.body.name);
        context.res = {
            // status: 200, /* Defaults to 200 */
            body: "Hello " + (req.query.name || req.body.name)
        };
    }
    else {
        context.res = {
            status: 400,
            body: "Please pass a name on the query string or in the request body"
        };
    }
};

أضف الرمز الذي يستخدم msg كائن توثيق الإخراج context.bindings لإنشاء رسالة قائمة انتظار. إضافة هذا الرمز قبل عبارة context.res.

context.bindings.msg = name;

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

import { AzureFunction, Context, HttpRequest } from "@azure/functions"

const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
    context.log('HTTP trigger function processed a request.');
    const name = (req.query.name || (req.body && req.body.name));

    if (name) {
        // Add a message to the storage queue, 
        // which is the name passed to the function.
        context.bindings.msg = name; 
        // Send a "hello" response.
        context.res = {
            // status: 200, /* Defaults to 200 */
            body: "Hello " + (req.query.name || req.body.name)
        };
    }
    else {
        context.res = {
            status: 400,
            body: "Please pass a name on the query string or in the request body"
        };
    }
};

export default httpTrigger;

إضافة التعليمات البرمجية التي تستخدم 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
})

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

if (!string.IsNullOrEmpty(name))
{
    // Add a message to the output collection.
    msg.Add(string.Format("Name passed to the function: {0}", name));
}

في هذه المرحلة، يجب أن تبدو الدالة كما يلي:

[FunctionName("HttpExample")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, 
    [Queue("outqueue"),StorageAccount("AzureWebJobsStorage")] ICollector<string> msg, 
    ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string name = req.Query["name"];

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    dynamic data = JsonConvert.DeserializeObject(requestBody);
    name = name ?? data?.name;

    if (!string.IsNullOrEmpty(name))
    {
        // Add a message to the output collection.
        msg.Add(string.Format("Name passed to the function: {0}", name));
    }
    return name != null
        ? (ActionResult)new OkObjectResult($"Hello, {name}")
        : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}

الآن، يمكنك استخدام معلمة ⁧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
    

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

     ...
    
     Now listening on: http://0.0.0.0:7071
     Application started. Press Ctrl+C to shut down.
    
     Http Functions:
    
             HttpExample: [GET,POST] http://localhost:7071/api/HttpExample
     ...
    
     

    ملاحظة

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

  2. قم بنسخ عنوان URL⁧HttpExample⁩ الخاص بك لوظيفة من هذا الإخراج إلى مستعرض، وإلحاق سلسلة ⁧?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

يمكنك عرض قائمة الانتظار في مدخل 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 encoded⁦⁩، يجب فك ترميز الرسالة قبل عرضها. بعد تنفيذك لـ ⁧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. يجب أن يعرض المتصفح نتيجة مشابهة كما هو الحال عند تشغيل الدالة محلياً.

    The output of the function runs on Azure in a browser

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

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

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

az group delete --name AzureFunctionsQuickstart-rg

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

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