예제 #1
0
        public override IMessageStatus SendRequest(IRequest request)
        {
            var requestData = new SenderProvidedRequestData()
            {
                Id                    = ReferenceName,
                MessageID             = request.MessageId.ToString(),
                MessagePrimaryContent = request.MessageContent,
                TestMessage           = request.IsTest != null && request.IsTest.Value ? new smev3_1_2_test.Void() : null
            };

            var signedMessage = CryptoProNetHelper.SignSmevObject(requestData, ReferenceName, SerialNumber);

            IMessageStatus status = null;

            Execute(delegate
            {
                var metadata = SmevService.SendRequest(requestData, null, signedMessage, out _);

                status = SmevTestMessageStatus.Create(metadata);
            }, request.MessageId);

            return(status);
        }
예제 #2
0
        public ISMEV3Result SendRequest <T>(T requestData, IDictionary <string, byte[]> attachments)
        {
            var result = new SMEV3Result {
                MessageId = GuidGenerator.GenerateTimeBasedGuid().ToString()
            };

            try
            {
                var senderRequestData = new SenderProvidedRequestData();
                senderRequestData.Id                 = "SIGNED_BY_CONSUMER";
                senderRequestData.MessageID          = result.MessageId;
                senderRequestData.ReferenceMessageID = senderRequestData.MessageID;

                if (testmessage)
                {
                    senderRequestData.TestMessage = new Smev3Service.Void();
                }

                senderRequestData.MessagePrimaryContent = SerializeDetails <T>(requestData);

                AttachmentContentType[] contentList = null;
                if (attachments != null && attachments.Count > 0)
                {
                    // передача будет через MTOM
                    if (attachments.Sum(o => o.Value.Length) < 5242880)
                    {
                        var attachementHeaders  = new List <AttachmentHeaderType>();
                        var attachementContents = new List <AttachmentContentType>();

                        foreach (var attachment in attachments)
                        {
                            var attachementHeader = new AttachmentHeaderType
                            {
                                contentId      = attachment.Key,
                                MimeType       = "application/octet-stream",
                                SignaturePKCS7 = SignedPkcs7.ComputeSignature(attachment.Value)
                            };
                            var attachementContent = new AttachmentContentType
                            {
                                Id      = attachment.Key,
                                Content = attachment.Value
                            };
                            attachementHeaders.Add(attachementHeader);
                            attachementContents.Add(attachementContent);
                        }
                        senderRequestData.AttachmentHeaderList = attachementHeaders.ToArray();
                        contentList = attachementContents.ToArray();
                    }
                    else                     // Передача через FTP
                    {
                        var refAttachements = new List <RefAttachmentHeaderType>();
                        foreach (var attachment in attachments)
                        {
                            var uuid = GuidGenerator.GenerateTimeBasedGuid().ToString();

                            FtpUpLoad(uuid, attachment.Key, attachment.Value);

                            var hash = SignedPkcs7.ComputeDigest(attachment.Value);

                            var refAttachement = new RefAttachmentHeaderType
                            {
                                uuid           = uuid,
                                Hash           = Convert.ToBase64String(hash),
                                MimeType       = "application/octet-stream",
                                SignaturePKCS7 = SignedPkcs7.ComputeSignatureDigest(hash)
                            };
                            refAttachements.Add(refAttachement);
                        }
                        senderRequestData.RefAttachmentHeaderList = refAttachements.ToArray();
                    }
                }

                var request  = new SendRequest(senderRequestData, null, null);
                var smevSign = SerializeWithSign(request, "SIGNED_BY_CONSUMER");
                request.CallerInformationSystemSignature = smevSign;
                request.AttachmentContentList            = contentList;

                var response = smev.SendRequest(request);
                result.SoapRequest  = behavior.SoapRequest;
                result.SoapResponse = behavior.SoapResponse;
                if (!response.MessageMetadata.StatusSpecified)
                {
                    result.Status = SMEV3ResultStatus.OK;
                    return(result);
                }

                var status = response.MessageMetadata.Status;
                if (status == InteractionStatusType.requestIsQueued ||
                    status == InteractionStatusType.requestIsAcceptedBySmev ||
                    status == InteractionStatusType.underProcessing)
                {
                    result.Status = SMEV3ResultStatus.OK;
                }
                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 = "";
                while (e != null)
                {
                    result.ErrorText += e.Message + "\n";
                    result.ErrorText += e.StackTrace + "\n\n";
                    e = e.InnerException;
                }
            }

            return(result);
        }