【问题标题】:Communicating Between Blazor app and Microservice api using azure service bus使用 azure 服务总线在 Blazor 应用程序和微服务 api 之间进行通信
【发布时间】:2021-10-21 03:31:52
【问题描述】:

我正在创建一个微服务,其中一个应用使用 azure 服务总线队列将选定的过滤器发送到其他应用。

我能够发送和接收消息,但无法在我的 SQL 查询中使用接收到的消息。

API 被一个应用程序(前端)攻击。

.../api/用户

我们的控制器

public class UserController : ControllerBase
{
      public IEnumerable<dynamic> Get()
        {
           
            return userRepository.GetAll();
        }
}

GetAll 方法

public IEnumerable<dynamic> GetAll()
        {
           
             ReceiveMsg().GetAwaiter().GetResult(); // We have called receiveMsg from here
            
                startdate = content1[0];
                enddate = content1[1];

                using (IDbConnection dbConnection = connection)
                {
var result = connection.Query("select * from [User] where DateofBirth between '" + startdate + "' and'" + enddate + "'");
                    
                    return result;
                }
      
        }

接收消息方法`

public static async Task ReceiveMsg()
        {
         // 
            string sbConnectionString = <connection string for Service Bus namespace>;
            string sbQueueName = <Queue name>;
        try
        {
            queueClient = new QueueClient(sbConnectionString, sbQueueName);

            var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)
            {
                MaxConcurrentCalls = 1,
                AutoComplete = false
            };
             queueClient.RegisterMessageHandler(ReceiveMessagesAsync, messageHandlerOptions);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        finally
        {
            Console.ReadKey();
            await queueClient.CloseAsync();
        }
    }



 public static async Task ReceiveMessagesAsync(Message message, CancellationToken token)
{
    Debug.WriteLine($"Received message: {Encoding.UTF8.GetString(message.Body)}");
    var receivedmsg = Encoding.UTF8.GetString(message.Body);
    
    ServiceBusMessage DeserializeMsg = JsonConvert.DeserializeObject<ServiceBusMessage>(receivedmsg);
     
    content1 = DeserializeMsg.Content;

    await queueClient.CompleteAsync(message.SystemProperties.LockToken);
}



static Task ExceptionReceivedHandler(ExceptionReceivedEventArgs exceptionReceivedEventArgs)
{
    Console.WriteLine(exceptionReceivedEventArgs.Exception);
    return Task.CompletedTask;
}`

【问题讨论】:

    标签: c# asp.net-core microservices blazor-server-side azure-servicebus-queues


    【解决方案1】:

    您在这里混合了两种范式 - 消息泵和按需接收消息。使用消息泵,当使用.ReceiveMessageHandler() 时,您要求服务总线 SDK 运行一个连续循环,即“消息泵”,以便在消息到达时接收它们。在向 Web API(通过控制器)发出请求时,这与显式消息检索不一致。您需要重新设计应用程序并根据需要检索消息,而不是运行消息泵。

    【讨论】:

    • 你能建议任何不同的方法
    • “您需要重新设计应用程序并根据需要检索消息,而不是运行消息泵。”具体来说,使用MessageReceiver 在调用控制器时按需检索一条(或多条)消息。即使这样也不是很好。您应该检查您想要实现的目标并进行相应的设计。
    • 感谢您的建议
    猜你喜欢
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    相关资源
    最近更新 更多