При неудачной записи в служебную шину Azure ошибок не возникает. - PullRequest
0 голосов
/ 27 марта 2019

При записи сообщения в служебную шину Azure (с использованием стандартной библиотеки Microsoft.Azure.ServiceBus, а не версии .Net Framework) оно работает нормально. Однако при переключении сетей на сеть, которая блокирует этот трафик и запускает его снова, я ожидаю, что SendAsync выдаст ошибку, но ошибки не будет, поэтому функция считает отправку успешной, даже если это не так.

Мне не хватает какой-то логики, чтобы убедиться, что ошибки действительно возникают и попадают в ловушку, похоже, это соответствует всем примерам, которые я видел.

Я пробовал это возможное решение ..

Исключение при обнаружении неполадок в методе SendAsync служебной шины Azure

.ContinueWith (t => { Console.WriteLine (t.Status + "," + t.IsFaults + "," + t.Exception.InnerException); }, TaskContinuationOptions.OnlyOnFapted);

.. и ни в коем случае ContinueWith не получает удар.

[HttpPost]
[Consumes("application/json")]
[Produces("application/json")]
public ActionResult<Boolean> Post(Contract<T> contract)
{
    Task.Run(() => SendMessage(contract)); 

    // Other stuff
}

private async Task<ActionResult<Boolean>> SendMessage(Contract<T> contract)
    {
        JObject json = JObject.FromObject(contract);
        Message message = new Message();
        message.MessageId = Guid.NewGuid().ToString();
        message.ContentType = ObjectType;
        message.PartitionKey = ObjectType;
        message.Body = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(contract));

        foreach (KeyValuePair<String, String> route in DataRouting)
        {
            JToken jToken = json.SelectToken(route.Value);
            if (jToken != null)
            {
                message.UserProperties[route.Key] = jToken.Value<String>();
            }
            else
            {
                String routeError = $"Could not find routing information in request for: {route.Key} in {route.Value}";
                Logger.LogError(routeError);
                return new UnprocessableEntityObjectResult(routeError);
            }
        }

        // Send the message
        try
        {
            await topicClient.SendAsync(message);
        }
        catch(Exception ex)
        {
            return new UnprocessableEntityObjectResult($"'Could not transmit message to service bus - {ex.Message}'");
        }

        return new OkObjectResult(true); 
    }

Я ожидаю, что ловушка ошибок будет срабатывать, если SendAsync не сможет отправить сообщение. Однако он по сути срабатывает и забывает, что отправка сообщения блокируется брандмауэром, но никогда не сообщается вызывающей стороне, выдавая ошибку.

1 Ответ

0 голосов
/ 27 марта 2019

Хорошо, нашел ответ, но я оставлю это там на случай, если кто-то еще сделает это для себя.Это было до моей общей маппетрии, когда собирал контроллер MVC.Установите async в действии Post и настройте ожидание при отправке.Очевидно, но я это пропустил.

    public virtual async Task<ActionResult<Boolean>> Post(Contract<T> contract){}

...

        // Send the message
        try
        {
            await topicClient.SendAsync(message).ConfigureAwait(false);
            return new OkObjectResult(true); // Success if we got here
        }
        catch(Exception ex)
        {
            return new UnprocessableEntityObjectResult($"'Could not transmit message to service bus - {ex.Message}'");
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...