Используя более старую библиотеку «Windows.Azure.ServiceBus», я могу настроить SqlFilter, который принимает в качестве параметров TimeSpan, но когда я пытаюсь сделать то же самое с помощью библиотеки «Microsoft.Azure.ServiceBus», происходит сбой с следующая ошибка:
Объект не поддерживается типа: TimeSpan. Только следующие типы
поддерживается через HTTP: строка, int, long, bool, double, DateTime
Что я пытаюсь сделать:
- Я хочу иметь 2 подписки на мою тему (highPriority, normalPriority)
- Сообщения имеют свойство пользователя с именем «StartDate»
- Если StartDate <= 1 день, то он должен перейти на подписку highPriority, иначе он должен перейти на normalPriority. [т.е. (StartDate - sys.EnqueuedDateTimeUtc) <= 24 часа]. </li>
Код, который работает (при использовании более старого пакета .net-framework Windows.Azure.ServiceBus):
SqlFilter highMessagesFilter =
new SqlFilter("(StartDate-sys.EnqueuedTimeUtc) <= @TimeSpanImmediateWindow");
highMessagesFilter.Parameters.Add("@TimeSpanImmediateWindow", TimeSpan.FromDays(1));
var subscription = SubscriptionClient.CreateFromConnectionString(connectionString,topicName, subName1);
subscription.RemoveRule(RuleDescription.DefaultRuleName);
subscription.AddRule(new RuleDescription()
{
Name = RuleDescription.DefaultRuleName,
Filter = highMessagesFilter,
Action = new SqlRuleAction("set priorityCalc = (StartDate-sys.EnqueuedTimeUtc)")
});
Где, как, этот код (используя: Microsoft.Azure.ServiceBus) не работает:
var filter = new SqlFilter("(StartDate-sys.EnqueuedTimeUtc) <= @TimeSpanHoursImmediateWindow");
filter.Parameters.Add("@TimeSpanHoursImmediateWindow",TimeSpan.FromDays(1));
var ruleDescription = new RuleDescription
{
Filter = filter,
Action = new SqlRuleAction(@"
SET HighPriority = TRUE;
SET Window = StartDate - sys.EnqueuedTimeUtc
"),
Name = RuleDescription.DefaultRuleName,
};
await managementClient.UpdateRuleAsync(topicPath,subscriptionName,ruleDescription);
Приведенный выше код выдает следующую ошибку:
Объект не поддерживается типа: TimeSpan. Только следующие типы
поддерживается через HTTP: строка, int, long, bool, double, DateTime
Если вместо managementClient.UpdateRuleAsync я попробую использовать следующий код:
var subClient = new SubscriptionClient(connectionString, topicPath, subscriptionName);
await subClient.RemoveRuleAsync(RuleDescription.DefaultRuleName);
await subClient.AddRuleAsync(ruleDescription);
Сбой со следующей ошибкой (ServiceBusException):
Сообщение Службе не удалось обработать запрос; пожалуйста, повторите
операция. Для получения дополнительной информации о типах исключений и надлежащем
обработка исключений, пожалуйста, обратитесь к
http://go.microsoft.com/fwlink/?LinkId=761101
Ссылка на майкрософт есть список исключений и FilterException, но это не так!
Вот трассировка стека 2-го исключения:
в
Microsoft.Azure.ServiceBus.Amqp.AmqpSubscriptionClient.OnAddRuleAsync (RuleDescription
описание) в
C: \ источник \ лазурь-сервис шины DotNet \ SRC \ Microsoft.Azure.ServiceBus \ AMQP \ AmqpSubscriptionClient.cs: линия
132 в
Microsoft.Azure.ServiceBus.SubscriptionClient.AddRuleAsync (RuleDescription
описание) в
C: \ источник \ лазурь-сервис шины DotNet \ SRC \ Microsoft.Azure.ServiceBus \ SubscriptionClient.cs: линия
499 в UserQuery.Main () в
C: \ Users \ XXXX \ AppData \ Local \ Temp \ LINQPad6_quhgasgl \ niqvie \ LINQPadQuery.cs: линия
82
Итак, мои вопросы:
Можно ли использовать параметры TimeSpan с использованием стандартной библиотеки .net? или мне придется использовать более старую библиотеку .net Framework, если я хочу использовать TimeSpans.
Есть ли лучший способ реализовать то, что я пытаюсь сделать, способ работать с более новой стандартной библиотекой .net? (К вашему сведению: я думал об отправке вычисления в качестве параметра (десятичного), и тогда параметр будет двойным, а не TimeSpan). И на самом деле это то, что я мог бы в конечном итоге сделать.