C# Azure ServiceBus / Azure SQL - работает локально, не работает при развертывании на Azure - PullRequest
0 голосов
/ 19 января 2020

Просто начинаю работать с Azure. Иметь простое приложение C#. NET Core, которое подключается к Azure ServiceBus, читает сообщения и записывает их в базу данных Azure SQL. Работает локально просто отлично - подключается к удаленной Azure Service Bus Queue, читает сообщения, подключается к удаленной Azure SQL db, записывает записи. То же самое точное приложение, развернутое в Azure в качестве WebApp, похоже, «работает», но больше не читает сообщения из Services Bus и больше ничего не записывает в Azure SQL.

Вот все приложение (т.е. Program.cs):

using System;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Azure.ServiceBus;

using System.Data.SqlClient;

namespace ServiceBusReader
{
    class Program
    {
        const string ServiceBusConnectionString = "SB_CONNECTION_STRING";
        const string QueueName = "BasicQueue";
        static IQueueClient queueClient;

        static SqlConnection connection = null;

        public static async Task Main(string[] args)
        {

            System.Diagnostics.Trace.TraceError("Inside Main function...");

            queueClient = new QueueClient(ServiceBusConnectionString, QueueName);

            Console.WriteLine("======================================================");
            System.Diagnostics.Trace.TraceError("======================================================");
            Console.WriteLine("Press ENTER key to exit after receiving all the messages.");
            Console.WriteLine("======================================================");

                SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();

                builder.DataSource = "XXXX.database.windows.net"; 
                builder.UserID = "USERID";            
                builder.Password = "PASSWORD";     
                builder.InitialCatalog = "mySampleDatabase";

                connection = new SqlConnection(builder.ConnectionString);
                connection.Open();

            // Register the queue message handler and receive messages in a loop
            RegisterOnMessageHandlerAndReceiveMessages();

            Console.ReadKey();

            await queueClient.CloseAsync();
        }

        static void RegisterOnMessageHandlerAndReceiveMessages()
        {
            // Configure the message handler options in terms of exception handling, number of concurrent messages to deliver, etc.
            var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)
            {
                // Maximum number of concurrent calls to the callback ProcessMessagesAsync(), set to 1 for simplicity.
                // Set it according to how many messages the application wants to process in parallel.
                MaxConcurrentCalls = 1,

                // Indicates whether the message pump should automatically complete the messages after returning from user callback.
                // False below indicates the complete operation is handled by the user callback as in ProcessMessagesAsync().
                AutoComplete = false
            };

            // Register the function that processes messages.
            queueClient.RegisterMessageHandler(ProcessMessagesAsync, messageHandlerOptions);
        }

        static async Task ProcessMessagesAsync(Message message, CancellationToken token)
        {
            // Process the message.
            Console.WriteLine($"Received message: SequenceNumber:{message.SystemProperties.SequenceNumber} Body:{Encoding.UTF8.GetString(message.Body)}");

             string query = "INSERT INTO [SalesLT].[messages] (message) VALUES(@Message)"; 
             SqlCommand cmd = new SqlCommand(query, connection);
             System.Diagnostics.Trace.TraceError(Encoding.UTF8.GetString(message.Body));
             cmd.Parameters.AddWithValue("@Message", Encoding.UTF8.GetString(message.Body));

             cmd.ExecuteNonQuery();
             Console.WriteLine("Records Inserted Successfully...");
             System.Diagnostics.Trace.TraceError("Records Inserted Successfully...");

            // Complete the message so that it is not received again.
            // This can be done only if the queue Client is created in ReceiveMode.PeekLock mode (which is the default).
            await queueClient.CompleteAsync(message.SystemProperties.LockToken);

            // Note: Use the cancellationToken passed as necessary to determine if the queueClient has already been closed.
            // If queueClient has already been closed, you can choose to not call CompleteAsync() or AbandonAsync() etc.
            // to avoid unnecessary exceptions.
        }

        // Use this handler to examine the exceptions received on the message pump.
        static Task ExceptionReceivedHandler(ExceptionReceivedEventArgs exceptionReceivedEventArgs)
        {
            Console.WriteLine($"Message handler encountered an exception {exceptionReceivedEventArgs.Exception}.");
            var context = exceptionReceivedEventArgs.ExceptionReceivedContext;
            Console.WriteLine("Exception context for troubleshooting:");
            Console.WriteLine($"- Endpoint: {context.Endpoint}");
            Console.WriteLine($"- Entity Path: {context.EntityPath}");
            Console.WriteLine($"- Executing Action: {context.Action}");
            return Task.CompletedTask;
        }
    }
}

Должен ли я сделать что-то другое в этом приложении, чтобы оно работало в Azure?

1 Ответ

0 голосов
/ 20 января 2020

Похоже, вы пытаетесь развернуть веб-работу в веб-приложении. Могу ли я узнать, если вы установили тип Continuous? Если вы установили значение Continuous, веб-работа будет автоматически выполняться после развертывания.

enter image description here

По умолчанию тип Triggered, и вам необходимо вручную запустить веб-задание с портала.

...