public string SendMessage <T>(string token, T request, string appClientId) where T : IOpenApiClientRequest { var kktServiceClient = new KktService.OpenApiAsyncMessageConsumerServicePortTypeClient(); using (new OperationContextScope(kktServiceClient.InnerChannel)) { var requestMessage = new HttpRequestMessageProperty(); requestMessage.Headers["FNS-OpenApi-Token"] = token; requestMessage.Headers["FNS-OpenApi-UserToken"] = Convert.ToBase64String(Encoding.UTF8.GetBytes(appClientId.Trim().ToLowerInvariant())); OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage; var sendMessageRequest = new KktService.SendMessageRequest(); var xmlRequest = request.ToXmlDocument(); _logWriter.Trace(request.ToXmlString()); sendMessageRequest.Message = xmlRequest.DocumentElement; var sendMessageResponse = kktServiceClient.SendMessageAsync(sendMessageRequest.Message) .GetAwaiter() .GetResult(); var messageId = sendMessageResponse.MessageId; _logWriter.Trace($"messageId: {messageId}"); var stopwatch = Stopwatch.StartNew(); while (true) { if (stopwatch.ElapsedMilliseconds > ResponseTimeout) { stopwatch.Stop(); throw new TimeoutException("Превышено время ожидания ответа."); } Thread.Sleep(ResponseWaitTime); var getMessageRequest = new KktService.GetMessageRequest { MessageId = messageId }; try { var getMessageResponse = kktServiceClient.GetMessageAsync(getMessageRequest) .GetAwaiter() .GetResult(); if (getMessageResponse.ProcessingStatus != KktService.ProcessingStatuses.COMPLETED) { continue; } _logWriter.Trace(getMessageResponse.Message.OuterXml); return(getMessageResponse.Message.OuterXml); } catch (FaultException <KktService.AuthenticationFault> ex) { _logWriter.Error(ex); throw; } catch (FaultException <KktService.MessageNotFoundFault> ex) { _logWriter.Error(ex); throw; } } } }
public System.Threading.Tasks.Task <KktService.GetMessageResponse> GetMessageAsync(KktService.GetMessageRequest request) { return(base.Channel.GetMessageAsync(request)); }