0

使用较旧的“Windows.Azure.ServiceBus”库,我可以设置一个将 TimeSpan 作为其参数的 SqlFilter,但是当我使用“Microsoft.Azure.ServiceBus”库尝试相同时,它会失败并出现以下错误:

对象不属于支持的类型:TimeSpan。HTTP 仅支持以下类型:string,int,long,bool,double,DateTime

我正在尝试做的事情:

  1. 我想在我的主题上有 2 个订阅(highPriority、normalPriority)
  2. 消息有一个名为“StartDate”的用户属性
  3. 如果 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 行

所以我的问题是:

  1. 我可以使用 .net 标准库使用 TimeSpan 参数吗?或者如果我想使用 TimeSpans,我是否必须使用旧的 .net 框架库。

  2. 有没有更好的方法来实现我正在尝试做的事情,一种可以与较新的 .net 标准库一起使用的方法?(仅供参考:我考虑将计算作为参数(十进制)发送,然后参数将是双精度数,而不是 TimeSpan)。事实上,这就是我最终可能会做的事情。

4

1 回答 1

1

如果库抛出异常,说明它TimeSpan不是受支持的类型,那么它几乎就是你所拥有的。请注意,.NET Standard 客户端有两个实现,ManagementClient以及一些通过实体客户端进行的操作,例如订阅客户端。后者是使用 AMQP 实现的。ManagementClient完全基于HTTP。虽然使用 AMQP 实现是理想的,但它并不完整。我建议依靠ManagementClient. 这可能是使用订阅客户端修改规则引发异常的原因。

关于更好的方法-您的想法听起来不错。只要不是新客户端不接受的类型。此外,如果您想知道不再受支持的原因,可以在https://github.com/Azure/azure-sdk-for-net/issues向图书馆团队提出问题。TimeSpan

于 2019-06-19T04:24:13.483 回答