إرسال الطلبات عبر اتصال مختلط لـ Azure Relay

مكتمل

لإرسال الرسائل وتلقيها من خلال Azure Relay، يجب فهم كيفية كتابة التعليمة البرمجية الضرورية.

لنفترض أنك أنشأت المرحّل لخدمة فحص الرصيد في Azure Relay. الآن تريد تعديل خدمة فحص الرصيد والعملاء التي تستدعيها، بحيث يمكنهم إرسال رسائل من خلال المرحّل. تحتاج إلى معرفة كيفية كتابة هذه التعليمة البرمجية.

في هذه الوحدة، نستخدم فئات مثل HybridConnectionListener و HttpRequestMessage لإرسال الرسائل والرد عليها.

استخدام TokenProvider لتمرير بيانات الاعتماد

يجب أن تقوم مكونات وحدة الاستماع والإرسال بتعريف نفسها إلى Azure Relay عند الاتصال. لأي اتصال مختلط، يمكنك استخدام الفئة .NET TokenProvider لتمرير هذه المعلومات. عند إنشاء نهج وصول مشترك في مساحة الاسم الخاصة بك، يكون قد أنشئ Azure مفتاحًا أساسيًا وآخر ثانويًا. هذا المفتاح عبارة عن بيانات الاعتماد التي أضفتها إلى TokenProvider لتأمين الاتصالات.

توضح هذه التعليمة البرمجية كيفية تكوين بيانات الاعتماد وإضافتها إلى TokenProvider :

// Store credentials. In production code, keep these values in a secure location, such as Azure Key Vault.
private const string KeyName = "RootManageSharedAccessKey";
private const string Key = "<your key here>";

// Create and configure TokenProvider.
var tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(KeyName, Key);

توصيل وحدة الاستماع مع Azure Relay

لتوصيل وحدة الاستماع بخدمة Azure Relay، يجب عليك إنشاء مثيل للفئة وتكوينه HybridConnectionListener. تمرير معرّف موارد منتظم للمرحّل، وإلى TokenProvider للدالة الإنشائية.

// Store the connection details.
private const string RelayNamespace = "{RelayNamespace}.servicebus.windows.net";
private const string ConnectionName = "{HybridConnectionName}";

// Create and configure the listener.
var listener = new HybridConnectionListener(new Uri(string.Format("sb://{0}/{1}", RelayNamespace, ConnectionName)), tokenProvider);

بعد ذلك، يمكنك الاشتراك في الأحداث ذات الصلة في المرحّل، مثل أحداث الاتصال.

listener.Connecting += (o, e) => { Console.WriteLine("Connecting"); };
listener.Offline += (o, e) => { Console.WriteLine("Offline"); };
listener.Online += (o, e) => { Console.WriteLine("Online"); };

لتكوين كيفية استجابة وحدة الاستماع للرسائل، استخدم الخاصية RequestHandler الخاصة بها. لإرسال استجابة، استخدم StreamWriter.

listener.RequestHandler = (context) =>
{
    // Configure the response status.
    context.Response.StatusCode = HttpStatusCode.OK;
    context.Response.StatusDescription = "OK";
    // Use a stream writer to send text back.
    using (var sw = new StreamWriter(context.Response.OutputStream))
    {
        sw.WriteLine("hello!");
    }
    // Remember to close the context.
    context.Response.Close();
};

عندما يكون قد تم تكوين وحدة الاستماع، فإنك تفتحها لتبدأ الاستماع للرسائل. نظرًا إلى استضافة المرحّل ووحدة الاستماع ووحدة الإرسال جميعًا في مواقع مختلفة، قد يستغرق الأمر بعض الوقت للرد على الرسائل. من المهم استخدام التعليمة البرمجية غير المتزامنة لهذه الرسائل للتأكد من عدم ظهور تطبيقك وكأنه غير مستجيب أثناء انتظاره للاستجابات. لاحظ الكلمة الأساسية غير await المتزامنة وأسماء الأسلوب غير المتزامنة في التعليمات البرمجية التالية:

await listener.OpenAsync()

تذكر إغلاق وحدة الاستماع عند نقطة مناسبة في التعليمة البرمجية:

await listener.CloseAsync();

توصيل وحدة الإرسال مع Azure Relay

بالنسبة إلى وحدة الإرسال، لا يوجد عنصر خاص بـ Azure Relay. يمكنك استخدام عنصر HttpRequestMessage قياسي، تمامًا كما تفعل عند استدعاء أي خدمة ويب.

// Store the connection details.
private const string RelayNamespace = "{RelayNamespace}.servicebus.windows.net";
private const string ConnectionName = "{HybridConnectionName}";

// Formulate the URI.
var uri = new Uri(string.Format("https://{0}/{1}", RelayNamespace, ConnectionName));

// Create and configure the client. Use the Content property to specify the message text.
var client = new HttpClient();
var request = new HttpRequestMessage()
{
    RequestUri = uri,
    Method = HttpMethod.Get,
    Content = new StringContent("Obtain credit check for Sara McMurray")
};

لتمرير الرمز المميز، أضفه إلى عناوين الطلبات:

// Create the token from the token provider.
var token = (await tokenProvider.GetTokenAsync(uri.AbsoluteUri, TimeSpan.FromHours(1))).TokenString;

// Add the token to the headers.
request.Headers.Add("ServiceBusAuthorization", token);

الآن يمكنك إرسال رسالة باستخدام الأسلوب SendAsync، والحصول على استجابة بشكل غير متزامن:

// Send the request.
var response = await client.SendAsync(request);

// Display the result.
Console.WriteLine(await response.Content.ReadAsStringAsync());