在本地IIS中部署时,Azure消息服务未收到消息

问题描述

我用Asp.net Web API开发了一个应用程序。它在部署模式下很好地发送和接收消息。但是,当我在本地IIS ID上部署此应用程序时,未收到消息。该API调用得很好,但是没有触发绑定到在Azure Ques上接收消息时接收消息的事件。

这是我的代码

    public IHttpActionResult ReadServiceBusMessage(string outId)
    {
       
            int _outId = Convert.ToInt32(outId);
            OutletId = _outId;
            var Outletobj = (from ou in db.tblOutlets where ou.Id == _outId select ou).FirstOrDefault();
            CompanyId = Outletobj.CompanyId;
            bool? IsOMSAvailable = Outletobj.IsOMSAvailable;
            if (IsOMSAvailable != null && IsOMSAvailable == false)
            {
                return Ok("OMSAvailable is false");
            }
        string sbConnectionString = System.Configuration.ConfigurationManager.AppSettings["AzureReadPrimaryConnectionString"];
        string sbQueueName = System.Configuration.ConfigurationManager.AppSettings["AzureReadSubQueName"];
        try
        {
           
            queueClient = new QueueClient(sbConnectionString,sbQueueName);

            var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)
            {
                MaxConcurrentCalls = 1,AutoComplete = false
            };
            Console.WriteLine("I am here before register");
            queueClient.RegisterMessageHandler(ReceiveMessagesAsync,messageHandlerOptions);
            Console.WriteLine("I am here after register");
            //return Ok("I am here");
            //Console.Read();


        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            LogError(ex);
            return Ok(ex);
        }
        finally
        {
            //if (param != "login")
            //{
            Console.ReadLine();

            //}
            
            queueClient.CloseAsync();
        }
        return Ok();
    }

    static async Task ReceiveMessagesAsync(Message message,CancellationToken token)
     {
        Console.WriteLine("I am here");
        Guid Ord = new Guid();
        SendNotificationToClient(Ord);
        //GenerateException(0);
        try
        {
            
            var Outletobj = (from ou in db.tblOutlets where ou.Id == OutletId select ou).FirstOrDefault();
            CompanyId = Outletobj.CompanyId;
            bool? IsOMSAvailable = Outletobj.IsOMSAvailable;
            if (IsOMSAvailable != null && IsOMSAvailable == false)
            {
                return;
            }
            await queueClient.CompleteAsync(message.SystemProperties.LockToken);

            var obj = Encoding.UTF8.GetString(message.Body);
            if (obj.Contains("ThirdPartyOms"))
            {
                AzureServiceBusThirdPartyMessageModel _objx = JsonConvert.DeserializeObject<AzureServiceBusThirdPartyMessageModel>(obj.ToString());
                AddRecievedDataFromThirdPartyToRespectiveTables(_objx);
            }
            else
            {
                AzureServiceBusMessageModel[] _obj = Newtonsoft.Json.JsonConvert.DeserializeObject<AzureServiceBusMessageModel[]>(obj);
                AddRecievedDataToRespectiveTables(_obj);
            }



            //var test = _obj.ToString();


            //tblOrder ord = Newtonsoft.Json.JsonConvert.DeserializeObject<tblOrder>(obj);
            Console.WriteLine($"Received message: {Encoding.UTF8.GetString(message.Body)}");

            //UNCOMMENT BELOW CODE TO GENERATE EXCEPTION,SO THAT MESSSAGE WILL BE ADDED IN DEAD LETTER QUEUE
            //int i = 0;
            //i = i / Convert.ToInt32(message);


        }
        catch (Exception ex)
        {
            LogError(ex);
            if (ex.Message == "Input string was not in a correct format.")
            {
                AzureServiceBusMessageResponseModel azureResponse = new AzureServiceBusMessageResponseModel
                {
                    Code = MessageCode.IncorrectDataFormat,Message = ex.Message
                };
                que.SendResponseMessagetoServiceBus(azureResponse,OutletId);
            }
            if (ex.Message == "String was not recognized as a valid DateTime.")
            {
                AzureServiceBusMessageResponseModel azureResponse = new AzureServiceBusMessageResponseModel
                {
                    Code = MessageCode.IncorrectDataFormat,Message ="Order DateTime is in wrong format.Correct format is dd/mm/yyyy hh:mm:ss"
                };
                que.SendResponseMessagetoServiceBus(azureResponse,OutletId);
            }
            await queueClient.AbandonAsync(message.SystemProperties.LockToken);
            //var serviceListner = new AzureBusServiceQueListinerController();
            //serviceListner.LogError(ex);
        }
    }

解决方法

检查您的连接字符串是否具有足够的权限来接收消息。将TransportType=AmqpWebSockets附加到连接字符串的末尾即可。

有关更多详细信息,您可以参考类似的issue

,

我增加了 Azure 门户上消息的消息锁定持续时间,这解决了我的问题