Пользовательский веб-сервис. Блокировка. С#

Добрый день!

 

Реализовал пользовательский веб-сервис, который принимает оплаты 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 запроса на создание новых пейментов. Может у кого был опыт, как такое побороть? Буду благодарен.

Нравится

2 комментария

Сергей, вам нужно просто выстроить эти запросы в очередь

Один из подходов можно подсмотреть здесь https://stackoverflow.com/questions/7122608/wcf-concurrencymode-single-and-instancecontextmode-percall

Иной подход - это можно использовать статический объект и делать ему lock

Артем Гура,

cпасибо! помогло)

Показать все комментарии