Запретить метод API вызывать более одного раза за раз

87
9

У меня есть функция загрузки изображений, где я могу одновременно перетаскивать много изображений, чтобы загружать изображения. Это прекрасно работает, но проблема в том, что изображения, когда он загружается, должны получить конкретный идентификатор, если он будет первым загружаться.

Но так как сейчас я делаю проверку, если есть какая-либо другая загруженная, а затем, если я не загружаю изображение. Проблема здесь в том, что первое изображение не было сохранено до того, как следующий проверит, является ли он первым. Таким образом, это приведет к загрузке всех изображений с идентификатором, который должен иметь только первый.

Есть ли возможность создать метод репозитория, чтобы его можно было вызвать только один, и его нужно сохранить, прежде чем следующий вызов сможет достичь метода?

РЕДАКТИРОВАТЬ:

    foreach (string fileName in request.Files)
{
var companyName = request.Form.Get(0);
var productId = request.Form.Get(1);
if (string.IsNullOrWhiteSpace(companyName))
{
throw new Exception("No company found!");
}
if (string.IsNullOrWhiteSpace(productId))
{
throw new Exception("No product picked!");
}
HttpPostedFileBase file = request.Files[fileName];
if (file != null && file.ContentLength > 0)
{

//This is the method that calls the API
SaveUploadResource(file, companyName, productId);
}
}

Это метод репозитория:

                var productImage = pamContext.ProductResources.Where(w => w.ProductId == productId && w.CompanyName == companyName && w.LanguageCode == "en" && w.ResourceTypeId == "I");
if (!productImage.Any())
{
productResource.ResourceTypeId = "I";
}
pamContext.ProductResources.Add(productResource);
pamContext.SaveChanges();

спросил(а) 2021-01-19T11:16:27+03:00 2 месяца, 3 недели назад
1
Решение
62

Возможно, вы могли бы использовать инструкцию Lock

    private Object myLock= new Object();

foreach (string fileName in request.Files)
{
var companyName = request.Form.Get(0);
var productId = request.Form.Get(1);
if (string.IsNullOrWhiteSpace(companyName))
{
throw new Exception("No company found!");
}
if (string.IsNullOrWhiteSpace(productId))
{
throw new Exception("No product picked!");
}
HttpPostedFileBase file = request.Files[fileName];
if (file != null && file.ContentLength > 0)
{

lock (myLock)
{
//This is the method that calls the API
SaveUploadResource(file, companyName, productId);
}
}
}

Блокировка по существу приостанавливает любые последовательные исполнения до тех пор, пока предыдущий не завершится. Позаботьтесь о том, чтобы ваш метод не занимал слишком много времени в зависимости от количества выполненных вызовов, или время ответа могло складываться и становиться очень медленным.

ответил(а) 2021-01-19T11:16:27+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема