C# 不带接收器外观的事务性消息-会话窥视

C# 不带接收器外观的事务性消息-会话窥视,c#,asp.net,azure,servicebus,C#,Asp.net,Azure,Servicebus,我有一个分布式服务,处理一条消息需要10秒到10分钟的时间。该服务根据通过API接收的用户(=浏览器)请求启动。由于各种限制,服务的结果必须在初始请求之外返回(超时、断开的客户端连接…),因此我向请求用户返回一个SessionId,该SessionId可用于检索结果,直到结果过期 现在,当会话仍处于锁定状态时,用户可能会连续多次请求结果。例如,以下代码在60秒内被相同的SessionId命中: var session = await responseQueue.AcceptMessageSess

我有一个分布式服务,处理一条消息需要10秒到10分钟的时间。该服务根据通过API接收的用户(=浏览器)请求启动。由于各种限制,服务的结果必须在初始请求之外返回(超时、断开的客户端连接…),因此我向请求用户返回一个SessionId,该SessionId可用于检索结果,直到结果过期

现在,当会话仍处于锁定状态时,用户可能会连续多次请求结果。例如,以下代码在60秒内被相同的SessionId命中:

var session = await responseQueue.AcceptMessageSessionAsync(sessionId);
var response = await session.ReceiveAsync(TimeSpan.FromSeconds(60));
if (response == null)
{
    session.Abort();
    return null;
}
await response.AbandonAsync();
我需要的是一个没有锁定的设置,能够多次读取消息,直到消息过期,再加上能够等待尚未存在的消息

哪种ServiceBus解决方案适合这一需求

更新

这是一个肮脏的解决方案,仍在寻找更好的方法:

MessageSession session = null;

try
{
    session = await responseQueue.AcceptMessageSessionAsync(sessionId);
}
catch
{
    // ... and client has to try again until the 60 sec lock from other requests is released
}

var response = await session.ReceiveAsync(TimeSpan.FromSeconds(60));
// ...