static void Main(string[] args) { var messageTypeSelector = new MessageTypeSelector(); var queueManagerFactory = new AzureQueueClientFactory(); var connectionString = GetConnectionString(); var messageLookUp = messageTypeSelector.SelectMessageType(); if (messageLookUp == null) { return; } var queueManager = queueManagerFactory.Create(messageLookUp.Type, connectionString); var subscriptionName = GetSubscriptionName(); var messages = DisplayMessages(queueManager, subscriptionName); var usePrimaryColour = true; foreach (var message in messages) { Console.ForegroundColor = usePrimaryColour ? ConsoleColor.Gray : ConsoleColor.Cyan; usePrimaryColour = !usePrimaryColour; Console.WriteLine(message); } Console.ReadLine(); }
/// <summary> /// Получить запрос из очереди СМЭВ /// </summary> /// <returns>полученный запрос</returns> public override IRequest RecieveRequest() { var messageType = new MessageTypeSelector() { Id = ReferenceName }; var signedMessage = CryptoProNetHelper.SignSmevObject(messageType, ReferenceName, DefaultNamespace, SerialNumber); var request = SmevService.GetRequest(messageType, signedMessage); if (request == null) { return(null); } var message = SmevTestMessage.Create(request, out var ftpAttachments); if (ftpAttachments != null) { message.Attachments = RecieveFtpAttachments(ftpAttachments, message.MessageId).ToList <IAttachment>(); } OnRequestRecieved(new RequestRecievedEventArgs() { Request = message }); return(message); }
/// <summary> /// Получить ответ из очереди СМЭВ /// </summary> /// <returns>ответ на запрос, отказ или статус запроса</returns> public override IMessage RecieveResponse() { var messageType = new MessageTypeSelector() { Id = ReferenceName }; var signedMessage = CryptoProNetHelper.SignSmevObject(messageType, ReferenceName, DefaultNamespace, SerialNumber); var response = SmevService.GetResponse(messageType, signedMessage); if (response == null) { return(null); } var message = SmevTestMessage.Create(response); switch (message) { case IResponse responseMessage: OnResponseRecieved(new ResponseRecievedEventArgs() { Response = responseMessage }); return(responseMessage); case IReject reject: OnErrorRecieved(new ErrorRecievedEventArgs() { ErrorMessage = new ErrorStatus() { MessageId = reject.MessageId, Status = Status.Запрос_отклонен, ErrorMessage = reject.RejectionMessage } }); return(reject); case IStatusFault statusFault: OnErrorRecieved(new ErrorRecievedEventArgs() { ErrorMessage = new ErrorStatus() { MessageId = statusFault.MessageId, Status = Status.Ошибка_при_отправке, ErrorMessage = statusFault.SmevFaultDescription } }); return(statusFault); } return(null); }
public ISMEV3Request <XmlElement> GetRequest() { var result = new SMEV3RequestResult <XmlElement>(); try { var messageSelector = new MessageTypeSelector(); messageSelector.Id = "SIGNED_BY_CALLER"; messageSelector.Timestamp = DateTime.Now; var request = new GetRequest(messageSelector, null); var smevSign = SerializeWithSign(request, "SIGNED_BY_CALLER"); request.CallerInformationSystemSignature = smevSign; var response = smev.GetRequest(request); result.SoapRequest = behavior.SoapRequest; result.SoapResponse = behavior.SoapResponse; if (response.RequestMessage == null) { result.Status = SMEV3ResultStatus.QueueEmpty; return(result); } if (response.RequestMessage.Request != null) { var requestInfo = response.RequestMessage.Request; result.MessageId = requestInfo.SenderProvidedRequestData.MessageID; result.Timestamp = requestInfo.MessageMetadata.SendingTimestamp; result.ReplyTo = requestInfo.ReplyTo; result.SenderMnemonic = requestInfo.MessageMetadata.Sender.Mnemonic; result.RequestData = requestInfo.SenderProvidedRequestData.MessagePrimaryContent; result.Status = SMEV3ResultStatus.OK; if (response.RequestMessage.AttachmentContentList != null || requestInfo.FSAttachmentsList != null) { result.Attachments = new Dictionary <string, byte[]>(); } // Получение через MTOM if (requestInfo.SenderProvidedRequestData.AttachmentHeaderList != null) { foreach (var attachmentContent in response.RequestMessage.AttachmentContentList) { result.Attachments.Add(attachmentContent.Id, attachmentContent.Content); } } // Получение через FTP else if (requestInfo.SenderProvidedRequestData.RefAttachmentHeaderList != null) { foreach (var info in requestInfo.FSAttachmentsList) { var bytes = FtpDownLoad(info); result.Attachments.Add(info.FileName, bytes); } } } // Пока непонятно нужно ли это обрабатывать else if (response.RequestMessage.Cancel != null) { var cancel = response.RequestMessage.Cancel; result.MessageId = cancel.MessageID; result.SenderMnemonic = cancel.MessageMetadata.Sender.Mnemonic; result.Timestamp = cancel.MessageMetadata.SendingTimestamp; result.Status = SMEV3ResultStatus.Reject; } } catch (FaultException e) { result.SoapRequest = behavior.SoapRequest; result.SoapResponse = behavior.SoapResponse; result.Status = SMEV3ResultStatus.Fail; result.ErrorText = e.Message; } catch (Exception e) { result.Status = SMEV3ResultStatus.Error; result.ErrorText = e.Message; result.ErrorText += "\n" + e.StackTrace; } return(result); }
/// <summary> /// После получения ответа необходимо подтвердить получение методом Ack /// </summary> /// <typeparam name="T"></typeparam> /// <param name="namespaceuri"></param> /// <param name="rootname">Имя корневого элемента вида сведений, если null, берется имя класса</param> /// <returns></returns> public ISMEV3Response GetResponse() { var result = new SMEV3ResponseResult(); try { var messageSelector = new MessageTypeSelector(); messageSelector.Id = "SIGNED_BY_CALLER"; messageSelector.Timestamp = DateTime.Now; //var type = typeof(T); //var root = type.GetCustomAttributes(typeof(XmlRootAttribute), false).Select(o => (XmlRootAttribute)o).First(); //messageSelector.RootElementLocalName = string.IsNullOrWhiteSpace(root.ElementName) ? type.Name : root.ElementName; //messageSelector.NamespaceURI = root.Namespace; var request = new GetResponse(messageSelector, null); var smevSign = SerializeWithSign(request, "SIGNED_BY_CALLER"); request.CallerInformationSystemSignature = smevSign; var response = smev.GetResponse(request); result.SoapRequest = behavior.SoapRequest; result.SoapResponse = behavior.SoapResponse; if (response.ResponseMessage == null) { result.Status = SMEV3ResultStatus.QueueEmpty; return(result); } var status = response.ResponseMessage.Response.MessageMetadata.Status; if (status == InteractionStatusType.responseIsDelivered) { result.Status = SMEV3ResultStatus.OK; result.MessageId = response.ResponseMessage.Response.SenderProvidedResponseData.MessageID; result.OriginalMessageId = response.ResponseMessage.Response.OriginalMessageId; result.MessageType = (SMEV3MessageType)response.ResponseMessage.Response.MessageMetadata.MessageType; if (response.ResponseMessage.Response.SenderProvidedResponseData.MessagePrimaryContent != null) { result.ResponseData = response.ResponseMessage.Response.SenderProvidedResponseData.MessagePrimaryContent; if (response.ResponseMessage.AttachmentContentList != null || response.ResponseMessage.Response.FSAttachmentsList != null) { result.Attachments = new Dictionary <string, byte[]>(); } // Получение через MTOM if (response.ResponseMessage.Response.SenderProvidedResponseData.AttachmentHeaderList != null) { foreach (var attachmentContent in response.ResponseMessage.AttachmentContentList) { var filename = attachmentContent.Id; /*var header = response.ResponseMessage.Response.SenderProvidedResponseData.AttachmentHeaderList.FirstOrDefault(o => o.contentId == attachmentContent.Id); * if (header != null) * { * var ext = header.MimeType; * filename += ext; * }*/ result.Attachments.Add(filename, attachmentContent.Content); } } // Получение через FTP else if (response.ResponseMessage.Response.SenderProvidedResponseData.RefAttachmentHeaderList != null) { foreach (var info in response.ResponseMessage.Response.FSAttachmentsList) { var bytes = FtpDownLoad(info); result.Attachments.Add(info.FileName, bytes); } } } else if (response.ResponseMessage.Response.SenderProvidedResponseData.AsyncProcessingStatus != null) { var asyncstatus = response.ResponseMessage.Response.SenderProvidedResponseData.AsyncProcessingStatus; result.OriginalMessageId = asyncstatus.OriginalMessageId; result.Status = SMEV3ResultStatus.Reject; if (asyncstatus.StatusCategory == InteractionStatusType.underProcessing || asyncstatus.StatusCategory == InteractionStatusType.requestIsQueued || asyncstatus.StatusCategory == InteractionStatusType.requestIsAcceptedBySmev || asyncstatus.StatusCategory == InteractionStatusType.responseIsAcceptedBySmev) { result.Status = SMEV3ResultStatus.UnderProcessing; } else if (asyncstatus.StatusCategory == InteractionStatusType.cancelled || asyncstatus.StatusCategory == InteractionStatusType.requestIsRejectedBySmev || asyncstatus.StatusCategory == InteractionStatusType.doesNotExist) { result.Status = SMEV3ResultStatus.Reject; } result.ErrorText = asyncstatus.SmevFault == null ? asyncstatus.StatusDetails : (asyncstatus.StatusDetails + "\n" + asyncstatus.SmevFault.Code + " " + asyncstatus.SmevFault.Description); } else if (response.ResponseMessage.Response.SenderProvidedResponseData.RequestRejected != null) { var requestrejecteds = response.ResponseMessage.Response.SenderProvidedResponseData.RequestRejected; result.OriginalMessageId = response.ResponseMessage.Response.OriginalMessageId; foreach (var requestrejected in requestrejecteds) { result.ErrorText += requestrejected.RejectionReasonCode.ToString() + " " + requestrejected.RejectionReasonDescription; } result.Status = SMEV3ResultStatus.Reject; } // ------------- Пока непонятно нужно ли это обрабатывать --------------- else if (response.ResponseMessage.Response.SenderProvidedResponseData.RequestStatus != null) { var requeststatus = response.ResponseMessage.Response.SenderProvidedResponseData.RequestStatus; result.ErrorText = requeststatus.StatusDescription; result.Status = SMEV3ResultStatus.UnderProcessing; } } else { result.Status = SMEV3ResultStatus.Fail; result.ErrorText = "Статус сообщения, обработка которого не была предусмотрена"; } } catch (FaultException e) { result.SoapRequest = behavior.SoapRequest; result.SoapResponse = behavior.SoapResponse; result.Status = SMEV3ResultStatus.Fail; result.ErrorText = e.Message; } catch (Exception e) { result.Status = SMEV3ResultStatus.Error; result.ErrorText = e.Message; result.ErrorText += "\n" + e.StackTrace; } return(result); }