使用较旧的“Windows.Azure.ServiceBus”库,我可以设置一个将 TimeSpan 作为其参数的 SqlFilter,但是当我使用“Microsoft.Azure.ServiceBus”库尝试相同时,它会失败并出现以下错误:
对象不属于支持的类型:TimeSpan。HTTP 仅支持以下类型:string,int,long,bool,double,DateTime
我正在尝试做的事情:
- 我想在我的主题上有 2 个订阅(highPriority、normalPriority)
- 消息有一个名为“StartDate”的用户属性
- 如果 StartDate <= 1 天,那么它应该去 highPriority 订阅,否则它应该去 normalPriority。[即 (StartDate - sys.EnqueuedDateTimeUtc) <= 24 小时]。
有效的代码(使用旧的 .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 仅支持以下类型:string,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,但它不是!
这是第二个异常的堆栈跟踪:
在 Microsoft.Azure.ServiceBus.Amqp.AmqpSubscriptionClient.OnAddRuleAsync(RuleDescription description) 在 C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\Amqp\AmqpSubscriptionClient.cs:Microsoft.Azure 的第 132 行.ServiceBus.SubscriptionClient.AddRuleAsync(RuleDescription description) 在 C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\SubscriptionClient.cs:C:\Users\ UserQuery.Main() 中的第 499 行XXXX\AppData\Local\Temp\LINQPad6_quhgasgl\niqvie\LINQPadQuery.cs:82 行
所以我的问题是:
我可以使用 .net 标准库使用 TimeSpan 参数吗?或者如果我想使用 TimeSpans,我是否必须使用旧的 .net 框架库。
有没有更好的方法来实现我正在尝试做的事情,一种可以与较新的 .net 标准库一起使用的方法?(仅供参考:我考虑将计算作为参数(十进制)发送,然后参数将是双精度数,而不是 TimeSpan)。事实上,这就是我最终可能会做的事情。