Добрый день!
Реализовал пользовательский веб-сервис, который принимает оплаты 1С и инсертит или апдейтит их в СРМ. Метод, который принимает запросы, сначала проверяет по входным параметрам(1сId - айди пеймента в 1с), есть ли такой пеймент в СРМ, и если есть - апдейтит, если нет - инсертит.
[ServiceContract] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] public class UsrApiERP: BaseService { [OperationContract] [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)] public PaymentResponse payment(PaymentRequest request) { var userConnection = (UserConnection)HttpContext.Current.Session["UserConnection"]; if(isPaymentExist(request.paymentId, request.invoiceId, userConnection)) { updatePayment(request, userConnection); } else { insertPayment(request, userConnection); } var result = new PaymentResponse(); result.guid = getPaymentId(request.paymentId, request.invoiceId, userConnection); return result; }
Но недавно получилось так, что 1С отправила в 1 миг 3 запроса на создание одинаковых оплат( 1сId у всех одинаковый) и проверка не отработала правильно, так как записи еще не создались, а проверка пропустила все 3 запроса на создание новых пейментов. Может у кого был опыт, как такое побороть? Буду благодарен.
Нравится
Сергей, вам нужно просто выстроить эти запросы в очередь
Один из подходов можно подсмотреть здесь https://stackoverflow.com/questions/7122608/wcf-concurrencymode-single-and-instancecontextmode-percall
Иной подход - это можно использовать статический объект и делать ему lock