首页 > 解决方案 > 使用 powershell 调用多个 Web 服务时重复值

问题描述

我创建了一个具有一个端点的 .Net Core ASP.NET Web 服务,该端点没有任何参数,并且在第一次调用时将返回 1。每次调用它时,它都会按顺序返回下一个数字。必须没有重复。

在浏览器的多个选项卡中运行它时,它不会返回重复的数字。但是当我同时在多个命令提示符下使用这个 powershell 命令时,我得到了重复。

powershell -Command "(new-object net.webclient).DownloadString('http://localhost:47536/api/sequence/number')"

命令提示符结果

这是我的实现:

public class SequenceNumbers
{
  public ConcurrentDictionary<int, Numbers> _numbaList = new ConcurrentDictionary<int, 
  Numbers>();

  public static SequenceNumbers sqnum = null;

  public static SequenceNumbers getInstance()
  {
        if (sqnum == null)
        {
            sqnum = new SequenceNumbers();
            return sqnum;
        }
        else
        {
            return sqnum;
        }
  }
}

public class SequenceResource : ISequenceResource
{
  public static readonly object LockObject = new object();
  
  public async Task<List<Numbers>> GetAllSequenceNumbers()
  {

        SequenceNumbers seq = SequenceNumbers.getInstance();
        Numbers numctr = new Numbers();

        int lastSeqNumber = 1;

        lock (LockObject)
        {
            lastSeqNumber = seq._numbaList.ContainsKey(lastSeqNumber) ? 
            seq._numbaList.Last().Value.sequencenumber : lastSeqNumber;
                
            if (seq._numbaList.TryGetValue(lastSeqNumber, out Numbers seqNum))
            {
                lastSeqNumber++;
                numctr.sequencenumber = lastSeqNumber;
                seq._numbaList.TryAdd(numctr.sequencenumber, numctr);
            }
            else
            {
                numctr.sequencenumber = lastSeqNumber;
                seq._numbaList.TryAdd(numctr.sequencenumber, numctr);
            }
        }

        await Task.Run(() =>
        {
            Thread.Sleep(2000);
        });

        return seq._numbaList.Select(x => x.Value).ToList();

  }
}

[Route("api/[controller]")]
public class SequenceController : ControllerBase
{
  private readonly ISequenceResource _seqResource;
  public SequenceController(ISequenceResource seqResource)
  {
      _seqResource = seqResource;
  }

  [HttpGet("number")]

  public async Task<IActionResult> GetAllSequenceNumbers()
  {
    var seqNum = await _seqResource.GetAllSequenceNumbers();
    return Ok(seqNum);
  }
}

我在 ConfigureServices 中注册它

services.AddScoped<ISequenceResource, SequenceResource>(); 

如何避免重复号码甚至多次通话?我也使用了锁定过程,但不知道我是否正确实施。

标签: powershellasp.net-coreasp.net-core-webapi

解决方案


推荐阅读