При записи сообщения в служебную шину 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 не сможет отправить сообщение. Однако он по сути срабатывает и забывает, что отправка сообщения блокируется брандмауэром, но никогда не сообщается вызывающей стороне, выдавая ошибку.