C# 如果另一个请求正在运行方法,请等待完成

C# 如果另一个请求正在运行方法,请等待完成,c#,asp.net,concurrency,C#,Asp.net,Concurrency,我正在用C#、.NET Framework 4.7和MongoDb开发一个ASP.NET Web API应用程序 我有这个方法: [HttpPut] [Route("api/Public/SendCommissioning/{serial}/{withChildren}")] public HttpResponseMessage SendCommissioning(string serial, bool withChildren) { string errorMsg = "Cannot

我正在用C#、.NET Framework 4.7和MongoDb开发一个ASP.NET Web API应用程序

我有这个方法:

[HttpPut]
[Route("api/Public/SendCommissioning/{serial}/{withChildren}")]
public HttpResponseMessage SendCommissioning(string serial, bool withChildren)
{
    string errorMsg = "Cannot set commissioning.";

    HttpResponseMessage response = null;
    bool serverFound = true;

    try
    {
        [...]
        // Mongo
        MongoHelper mgHelper = new MongoHelper();
        mgHelper.InsertCommissioning(serial, withChildren);
    }
    catch (Exception ex)
    {
        _log.Error(ex.Message);

        response = Request.CreateResponse(HttpStatusCode.InternalServerError);
        response.ReasonPhrase = errorMsg;
    }

    return response;
}
有时会很快调用此方法,我在这里得到一个错误:

// Mongo
MongoHelper mgHelper = new MongoHelper();
mgHelper.InsertCommissioning(serial, withChildren);
在这里,我按顺序插入我收到的序列,有时我会在MongoDb中得到一个重复密钥的错误:

我有一个方法来获取Mongo中使用的最新id(主键)。两个请求得到相同的id,所以当我尝试在Mongo上插入它时,我得到一个无效的密钥异常

我想使用一个队列来存储序列,然后按照接收序列的相同顺序使用它们。但是我想当我尝试在MongoDb中存储序列时,我会得到同样的错误

也许如果我可以设置一个方法,如果它正在运行,我必须等待运行它,它就会工作。此方法将把序列插入Mongo中

我该怎么做?如果它正在运行,则无法在另一个Web Api请求中运行它的方法

或者,你知道更好的选择吗


顺便说一下,我不能阻止这种方法。也许我需要用这个同步部分运行一个线程。

使用一个按顺序处理请求的单例。或者在mongohelper中添加一个包装器,它使用某种形式的同步来添加您的行为。这不只是一个设计缺陷吗?你期望序列号是唯一的,但它不是?如果这是在同一个实例上,您可以锁定
InsertCommisioning
@rene中的静态对象。我有一个方法来获取Mongo中使用的最新id(主键)。两个请求得到相同的id,所以当我尝试在Mongo上插入它时,我得到了一个无效的密钥异常。好吧,只是没有得到最新的id。只要让客户端提供他们的新数据,插入Mongo并告诉客户端新数据刚刚得到的密钥。问题解决了,没有任何麻烦。数据库非常擅长在高负载下生成唯一的id…但我需要按照收到的顺序插入序列号。如果我让方法在我收到的另一个序列之前插入一个序列,那么它就是一个错误。这就是我想使用队列的原因。使用一个按顺序处理请求的单例。或者在mongohelper中添加一个包装器,它使用某种形式的同步来添加您的行为。这不只是一个设计缺陷吗?你期望序列号是唯一的,但它不是?如果这是在同一个实例上,您可以锁定
InsertCommisioning
@rene中的静态对象。我有一个方法来获取Mongo中使用的最新id(主键)。两个请求得到相同的id,所以当我尝试在Mongo上插入它时,我得到了一个无效的密钥异常。好吧,只是没有得到最新的id。只要让客户端提供他们的新数据,插入Mongo并告诉客户端新数据刚刚得到的密钥。问题解决了,没有任何麻烦。数据库非常擅长在高负载下生成唯一的id…但我需要按照收到的顺序插入序列号。如果我让方法在我收到的另一个序列之前插入一个序列,那么它就是一个错误。这就是我想使用队列的原因。