// Опис: Метод кој овозможува процесирање на НТТР Web повици // Влезни параметри: HttpContext context // Излезни параметри: / public void ProcessRequest(HttpContext context) { var validTId = false; var transactionId = new Guid(); try { var logGetSoapBody = AppSettings.Get <bool>("LogGetSoapBody"); if (logGetSoapBody) { _logger.Info( "Pred da go zeme samo soap body od porakata " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeGetSoapBody"); } var soapBody = _requestHelper.GetSoapBody(context.Request.InputStream); if (logGetSoapBody) { _logger.Info( "Otkako kje go zeme soap body od porakata " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterGetSoapBody"); } var contentType = context.Request.ContentType; #region Log SOAP Request Message var logSoap = AppSettings.Get <bool>("LogSoap"); if (logSoap) { _logger.Info(soapBody + Environment.NewLine + "ContentType: " + contentType, "Request to Internal handler"); } //soapBody = File.ReadAllText(@"C:\NSRequest.txt"); ; #endregion if (string.IsNullOrEmpty(soapBody)) { context.Response.StatusCode = 400; context.Response.End(); } var logUnwrapMimMessage = AppSettings.Get <bool>("LogUnwrapMimMessage"); if (logUnwrapMimMessage) { _logger.Info("Pred UnwrapMimMessage " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeUnwrapMimMessage"); } var mimMsg = _soapRequestHelper.UnwrapMimMessage(soapBody); if (logUnwrapMimMessage) { _logger.Info("Posle UnwrapMimMessage " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterUnwrapMimMessage"); } validTId = true; transactionId = new Guid(mimMsg.Header.MimHeader.TransactionId); #region Log MIM Message var logMimMessageRequest = AppSettings.Get <bool>("LogMimMessageRequest"); if (logMimMessageRequest) { _logger.Info("Pred LogMimMessage " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeLogMimMessage"); } _mimMsgHelper.LogMimMessage(mimMsg, _logger); if (logMimMessageRequest) { _logger.Info("Posle LogMimMessage " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterLogMimMessage"); } #endregion var logLoadOwnCertificate = AppSettings.Get <bool>("LogLoadOwnCertificate"); if (logLoadOwnCertificate) { _logger.Info("Pred LoadOwnCertificate " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeLoadOwnCertificate"); } var ownCert = _mimMsgHelper.LoadOwnCertificate(_logger); if (logLoadOwnCertificate) { _logger.Info("Posle LoadOwnCertificate " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterLoadOwnCertificate"); } var logGetPrivateKey = AppSettings.Get <bool>("LogGetPrivateKey"); if (logGetPrivateKey) { _logger.Info("Pred GetPrivateKey " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeGetPrivateKey"); } var privateKey = _mimMsgHelper.GetPrivateKey(ownCert.PrivateKey); if (logGetPrivateKey) { _logger.Info("Posle GetPrivateKey " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterGetPrivateKey"); } var publicKey = mimMsg.Header.MimHeader.PublicKey; var logValidateSignature = AppSettings.Get <bool>("LogValidateSignature"); if (logValidateSignature) { _logger.Info("Pred ValidateSignature " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeValidateSignature"); } if (_soapRequestHelper.ValidateSignature(soapBody, publicKey, _logger)) { if (logValidateSignature) { _logger.Info("Posle ValidateSignature " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterValidateSignature"); } var logValidateXml = AppSettings.Get <bool>("LogValidateXml"); if (logValidateXml) { _logger.Info("Pred ValidateXml " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeValidateXml"); } _validXmlMsgHelper.ValidateXml(soapBody); if (logValidateXml) { _logger.Info("Posle ValidateXml " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterValidateXml"); } } var symmetricKey = mimMsg.Header.CryptoHeader.Key; var iVector = mimMsg.Header.CryptoHeader.InitializationVector; var logEncryption = AppSettings.Get <bool>("LogEncryption"); if (logEncryption) { _logger.Info( "Pred da go dekriptira body koe kje se prati vo requestot " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeDecryptRequest"); } var decryptBody = _mimMsgHelper.DecryptSoapBody(Convert.FromBase64String(mimMsg.Body.MimBody.Message.ToString()), Convert.FromBase64String(symmetricKey), Convert.FromBase64String(iVector), privateKey); if (logEncryption) { _logger.Info( "Otkako kje go dekriptira body koe kje se prati vo requestot " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterDecryptRequest"); } #region Log DecryptBody if (AppSettings.Get <bool>("LogDecryptBody")) { _logger.Info("Decripting MIM message: " + decryptBody); } #endregion #region KIBS after DecryptSoapBody try { KIBSResponse resultkibs = null; if (mimMsg.Header.MimAdditionalHeader.IsInteropTestCommunicationCall) { resultkibs = new KIBSResponse { Hash = "InteropTestCommunicationCallHash" }; } else { if (AppSettings.Get <string>("KIBSEnviroment") != null) { if (AppSettings.Get <string>("KIBSEnviroment") == "Test") { var logKibsTimestamp = AppSettings.Get <bool>("LogKIBS"); if (logKibsTimestamp) { _logger.Info("Se koristi testen KIBS."); } var requestBeforeKibs = DateTime.Now; if (logKibsTimestamp) { _logger.Info( "Pred request ." + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "KIBSPredRequest"); } resultkibs = KIBS.KIBS.GenerateTimeStamp(soapBody); if (logKibsTimestamp) { _logger.Info( "Pred request ." + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "KIBSPosleRequest"); var totalMinRequestKibs = (int)(DateTime.Now - requestBeforeKibs).TotalMinutes; var totalSecRequestKibs = (int)(DateTime.Now - requestBeforeKibs).TotalSeconds; var totalMilisecRequestKibs = (int)(DateTime.Now - requestBeforeKibs).TotalMilliseconds; _logger.Info( "Kibs ni vratil odgovor za " + totalMinRequestKibs + " min " + totalSecRequestKibs + " sec " + totalMilisecRequestKibs + " miliseconds", "RequestKIBS"); } } if (AppSettings.Get <string>("KIBSEnviroment") == "Production") { _logger.Info("Se koristi produkciski KIBS."); resultkibs = KIBS.KIBS.GenerateTimeStampProduction(soapBody); } } //resultkibs = new KIBSResponse //{ // Hash = "InteropTestCommunicationCallHash", // TimeStamp = DateTime.Now //}; } try { if (resultkibs != null) { //Prethodno se zemashe vrednosta Timestamp od servisot na KIBS, i istata se zapisuvase vo baza //Sega se zapishuva DateTime.Now vo poleto Timestamp //_messageLogsRepository.UpdateMessageLog(mimMsg.Header.MimHeader.Dir, resultkibs.TimeStamp, // resultkibs.Hash, string.Empty, string.Empty, mimMsg.Header.MimHeader.TransactionId); var logUpdateMessageLog = AppSettings.Get <bool>("LogUpdateMessageLog"); if (logUpdateMessageLog) { _logger.Info( "Pred UpdateMessageLog " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeUpdateMessageLogRequest"); } _messageLogsRepository.UpdateMessageLog(mimMsg.Header.MimHeader.Dir, resultkibs.Hash, string.Empty, string.Empty, mimMsg.Header.MimHeader.TransactionId); if (logUpdateMessageLog) { _logger.Info( "Posle UpdateMessageLog " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterUpdateMessageLogRequest"); } //Prethodno se zemashe vrednosta Timestamp od servisot na KIBS, i istata se zapisuvase vo baza //Sega se zapishuva DateTime.Now vo poleto Timestamp //mimMsg.Header.MimHeader.TimeStamp = resultkibs.TimeStamp; //.ToString(); mimMsg.Header.MimHeader.TimeStamp = DateTime.Now; mimMsg.Header.MimAdditionalHeader.TimeStampToken = resultkibs.Hash; } } catch (Exception exception) { _logger.Error("Error while updating mim message: ", exception.Message); throw new Exception("Грешка при UpdateMessageLog!"); } } catch (Exception ex) { _logger.Info("KIBS error posle DecryptSoapBody: " + ex.Message); throw new Exception("KIBS врати грешка!"); } #endregion //_logger.Info("posle LogMimMessage"); var logGetServiceUrl = AppSettings.Get <bool>("LogGetServiceUrl"); if (logGetServiceUrl) { _logger.Info("Pred GetServiceUrl " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeGetServiceUrl"); } var urlToHostedApp = _requestHelper.GetServiceUrl(mimMsg.Header.MimHeader); if (logGetServiceUrl) { _logger.Info("Posle GetServiceUrl " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterGetServiceUrl"); } //_logger.Info("urlToHostedApp mimheader e: " + mimMsg.Header.MimHeader); _logger.Info("urlToHostedApp e: " + urlToHostedApp); #region ExecuteRequestToInstitution ResponseInteropCommunication responseEndPointInstitution; string decryptedRequestBodyWrappedInSoapEnvelope = "<s:Envelope xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\"><s:Body>" + decryptBody + "</s:Body></s:Envelope>"; if (mimMsg.Header.MimAdditionalHeader.IsInteropTestCommunicationCall) { responseEndPointInstitution = new ResponseInteropCommunication { Response = @"<s:Envelope xmlns:s=""http://www.w3.org/2003/05/soap-envelope""><s:Body><InteropTestCommunicationService xmlns=""http://tempuri.org/"">InteropTestCommunicationCallResponse</InteropTestCommunicationService></s:Body></s:Envelope>", MimeType = "InteropTestCommunicationCallMimeType" }; } else { try { _logger.Info("Povikot koj se prakja e: " + decryptedRequestBodyWrappedInSoapEnvelope); System.Net.ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true); //sertifikatot ne im e u red za toa go stavam ova za da go ignorira var timeBeforeCallInstitution = DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"); //ovaa linija da se proveri za custom interop fault greski, od tuka pa natamu da se proveruva povikot responseEndPointInstitution = _soapRequestHelper.Execute(decryptedRequestBodyWrappedInSoapEnvelope, contentType, urlToHostedApp, _logger); //_logger.Info( // "decryptedRequestBodyWrappedInSoapEnvelope" + decryptedRequestBodyWrappedInSoapEnvelope + // "contentType" + contentType + "urltToApp" + urlToHostedApp, "Test"); _logger.Info( "Calling institution in " + timeBeforeCallInstitution + " , receiving response in " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "InsitutionTotalResponse"); //ovie dva loga ne gi pravi bidejki direktno odi na exception! //_logger.Info("Response institution is: " + responseEndPointInstitution.Response, "InstitutionReturnedLength"); // _logger.Info("Response institution bez envelope is: " + _requestHelper.GetOnlySoapBodyFromString(responseEndPointInstitution.Response)); } //tuka probaj stavi catch (FaultException e) da vidish shto kje vrati catch (FaultException ex) { //_logger.Info("dosol vo fault exception."); //_logger.Error("Error koj se vrakja od fault exception e: ", ex); _logger.Error("Error koj se vrakja od fault exception Message e: ", ex.Message); //_logger.Error("Error koj se vrakja od fault exception inner exception e: ", ex.InnerException.Message); throw new FaultException(ex.Message); } //MARIJA //DODADENO za da se fati Web exception od povikot do adapterot vo slucaj koga toj e nedostapen //INICIJALNO ova BESE ZAKOMENTIRANO //catch (Exception e) //{ // _logger.Info("catch exception e: " + e.Message, "WebErrorVoPovikotDoAdapterot"); // //throw new Exception("Сервисот кој го повикавте врати грешка!", e); // throw new FaultException(e.Message); //} } #endregion #region Create MIM Message var logCreateMimResponseMsg = AppSettings.Get <bool>("LogCreateMimResponseMsg"); if (logCreateMimResponseMsg) { _logger.Info("Pred CreateMimResponseMsg " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeCreateMimResponseMsg"); } var mimMsgResponse = _mimMsgHelper.CreateMimResponseMsg(mimMsg, responseEndPointInstitution.MimeType); if (logCreateMimResponseMsg) { _logger.Info("Posle CreateMimResponseMsg " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterCreateMimResponseMsg"); } #region Log MIM Message //_logger.Info("Pred LogMimMessage."); var logMimMessageResponse = AppSettings.Get <bool>("LogMimMessageResponse"); if (logMimMessageResponse) { _logger.Info("Pred LogMimMessageResponse " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeLogMimMessageResponse"); } _mimMsgHelper.LogMimMessage(mimMsgResponse, _logger); if (logMimMessageResponse) { _logger.Info("Posle LogMimMessageResponse " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterLogMimMessageResponse"); } //_logger.Info("Posle LogMimMessage."); #endregion //_logger.Info("Pred responseWithoutSoapEnvelope."); var logGetOnlySoapBodyFromString = AppSettings.Get <bool>("LogGetOnlySoapBodyFromString"); if (logGetOnlySoapBodyFromString) { _logger.Info( "Pred GetOnlySoapBodyFromString " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeGetOnlySoapBodyFromString"); } string responseWithoutSoapEnvelope = _requestHelper.GetOnlySoapBodyFromString(responseEndPointInstitution.Response); if (logGetOnlySoapBodyFromString) { _logger.Info( "Posle GetOnlySoapBodyFromString " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterGetOnlySoapBodyFromString"); } //_logger.Info("Posle responseWithoutSoapEnvelope."); var logGetPublicKeyFromString = AppSettings.Get <bool>("LogGetPublicKeyFromString"); if (logGetPublicKeyFromString) { _logger.Info("Pred GetPublicKeyFromString " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeGetPublicKeyFromString"); } var publicKeyRsa = _mimMsgHelper.GetPublicKeyFromString(publicKey); if (logGetPublicKeyFromString) { _logger.Info("Posle GetPublicKeyFromString " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterGetPublicKeyFromString"); } if (logEncryption) { _logger.Info( "Pred da go enkriptira body koe kje se prati vo responsot " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeEncryptResponse"); } var encryptedBlock = _mimMsgHelper.EncryptSoapBody(responseWithoutSoapEnvelope, publicKeyRsa); if (logEncryption) { _logger.Info( "Otkako kje go enkriptira body koe kje se prati vo responsot " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterEncryptResponse"); } var encryptedSoapBody = Convert.ToBase64String(encryptedBlock.EncryptedData); var encryptedSessionKey = Convert.ToBase64String(encryptedBlock.EncryptedSessionKey); var encriptedIVector = Convert.ToBase64String(encryptedBlock.Iv); mimMsgResponse.Body.MimBody.Message = encryptedSoapBody; mimMsgResponse.Header.CryptoHeader.InitializationVector = encriptedIVector; mimMsgResponse.Header.CryptoHeader.Key = encryptedSessionKey; var logCreateMimXmlMsg = AppSettings.Get <bool>("LogCreateMimXmlMsg"); if (logCreateMimXmlMsg) { _logger.Info("Pred CreateMimXmlMsg " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeCreateMimXmlMsg"); } var doc = _mimMsgHelper.CreateMimXmlMsg(mimMsgResponse); if (logCreateMimXmlMsg) { _logger.Info("Posle CreateMimXmlMsg " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterCreateMimXmlMsg"); } #region KIBS after CreateMimXmlMsg try { KIBSResponse resultkibsResp = null; if (mimMsgResponse.Header.MimAdditionalHeader.IsInteropTestCommunicationCall) { resultkibsResp = new KIBSResponse { Hash = "InteropTestCommunicationCallHash" }; } else { if (AppSettings.Get <string>("KIBSEnviroment") != null) { if (AppSettings.Get <string>("KIBSEnviroment") == "Test") { var logKibsTimestamp = AppSettings.Get <bool>("LogKIBS"); if (logKibsTimestamp) { _logger.Info("Se koristi testen KIBS."); } var responseBeforeKibs = DateTime.Now; if (logKibsTimestamp) { _logger.Info( "Pred request ." + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "KIBSPredResponse"); } resultkibsResp = KIBS.KIBS.GenerateTimeStamp(doc.ToString()); if (logKibsTimestamp) { _logger.Info( "Pred request ." + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "KIBSPosleResponse"); var totalMinRequestKibs = (int)(DateTime.Now - responseBeforeKibs).TotalMinutes; var totalSecRequestKibs = (int)(DateTime.Now - responseBeforeKibs).TotalSeconds; var totalMilisecRequestKibs = (int)(DateTime.Now - responseBeforeKibs).TotalMilliseconds; _logger.Info( "Kibs ni vratil odgovor za " + totalMinRequestKibs + " min " + totalSecRequestKibs + " sec " + totalMilisecRequestKibs + " miliseconds", "ResponseKIBS"); } } if (AppSettings.Get <string>("KIBSEnviroment") == "Production") { _logger.Info("Se koristi produkciski KIBS."); resultkibsResp = KIBS.KIBS.GenerateTimeStampProduction(doc.ToString()); } } //resultkibsResp = new KIBSResponse //{ // Hash = "InteropTestCommunicationCallHash", // TimeStamp = DateTime.Now //}; } try { if (resultkibsResp != null) { //Prethodno se zemashe vrednosta Timestamp od servisot na KIBS, i istata se zapisuvase vo baza //Sega se zapishuva DateTime.Now vo poleto Timestamp //_messageLogsRepository.UpdateMessageLog(mimMsgResponse.Header.MimHeader.Dir, resultkibsResp.TimeStamp, resultkibsResp.Hash, string.Empty, string.Empty, mimMsg.Header.MimHeader.TransactionId); var logUpdateMessageLogResponse = AppSettings.Get <bool>("LogUpdateMessageLogResponse"); if (logUpdateMessageLogResponse) { _logger.Info( "Pred UpdateMessageLog " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeUpdateMessageLogResponse"); } _messageLogsRepository.UpdateMessageLog(mimMsgResponse.Header.MimHeader.Dir, resultkibsResp.Hash, string.Empty, string.Empty, mimMsg.Header.MimHeader.TransactionId); if (logUpdateMessageLogResponse) { _logger.Info( "Posle UpdateMessageLog " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterUpdateMessageLogResponse"); } //Prethodno se zemashe vrednosta Timestamp od servisot na KIBS, i istata se zapisuvase vo baza //Sega se zapishuva DateTime.Now vo poleto Timestamp //mimMsgResponse.Header.MimHeader.TimeStamp = resultkibsResp.TimeStamp;//.ToString(); mimMsgResponse.Header.MimHeader.TimeStamp = DateTime.Now; mimMsgResponse.Header.MimAdditionalHeader.TimeStampToken = resultkibsResp.Hash; } } catch (Exception exception) { _logger.Info("KIBS error: " + exception.Message); throw new Exception("KIBS врати грешка: " + exception.Message); } } catch (Exception ex) { _logger.Info("KIBS error after CreateMimXmlMsg: " + ex.Message); throw new Exception("KIBS врати грешка: " + ex.Message); } #endregion var logCreateMimSignedXmlMsg = AppSettings.Get <bool>("LogCreateMimSignedXmlMsg"); if (logCreateMimSignedXmlMsg) { _logger.Info("Pred CreateMimSignedXmlMsg " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeCreateMimSignedXmlMsg"); } var mimMsgResponseXml = _mimMsgHelper.CreateMimSignedXmlMsg(mimMsgResponse, ownCert, _logger); //Check for need of encryption if (logCreateMimSignedXmlMsg) { _logger.Info("Posle CreateMimSignedXmlMsg " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterCreateMimSignedXmlMsg"); } #endregion #region Log SOAP Response Message if (logSoap) { //LogHelper.WriteInNLoc("", "", mimMsgResponseXml, "Response_" + DateTime.Now, "Info"); _logger.Info(mimMsgResponseXml, "ResponseSignedXml"); } #endregion HttpContext.Current.Response.ContentType = "application/soap+xml"; context.Response.Write(mimMsgResponseXml); _logger.Info("Zavsilo se na Internal handler vo " + DateTime.Now + " casot.", "EndedOnInternalHandler"); } catch (FaultException ex) { //_logger.Info("dosol vo fault exception."); _logger.Error("Error koj se vrakja od fault exception e: ", ex, "CatchFaultException"); //_logger.Info("validTID vo glavniot catch e: " + validTId); if (validTId) { var soapFault = _mimMsgHelper.CreateSoapFault("Code value", "Code - SubCode value", "Details - MaxTime value", ex.Message); var soapFaultDb = _soapRequestHelper.CreateSoapFaultDB(transactionId, soapFault.Body.Fault.Code.value, soapFault.Body.Fault.Code.Subcode.value, soapFault.Body.Fault.Detail.maxTime, soapFault.Body.Fault.Reason.Text.value); try { _soapFaultRepo.InsertSoapFault(soapFaultDb); } catch (Exception exception) { _logger.Error(exception, "Nastanata greska pri kreiranje na soap fault vo baza."); } var soapFaultXml = _mimMsgHelper.CreateFaultMessage(soapFault); _logger.Info(soapFaultXml.InnerXml, "SoapFaultXml"); _logger.Error(soapFault.Body.Fault.Reason.Text.value, ex, "ErrorOnResponseInternalHandler"); HttpContext.Current.Response.ContentType = "application/soap+xml"; HttpContext.Current.Response.Write(soapFaultXml.InnerXml); } } catch (Exception ex) { _logger.Error("odma u catch", ex); _logger.Info("validTID vo glavniot catch e: " + validTId); if (validTId) { var soapFault = _mimMsgHelper.CreateSoapFault("Code value", "Code - SubCode value", "Details - MaxTime value", ex.Message); var soapFaultDb = _soapRequestHelper.CreateSoapFaultDB(transactionId, soapFault.Body.Fault.Code.value, soapFault.Body.Fault.Code.Subcode.value, soapFault.Body.Fault.Detail.maxTime, soapFault.Body.Fault.Reason.Text.value); try { _soapFaultRepo.InsertSoapFault(soapFaultDb); } catch (Exception exception) { _logger.Error(exception, "Nastanata greska pri kreiranje na soap fault vo baza."); } var soapFaultXml = _mimMsgHelper.CreateFaultMessage(soapFault); _logger.Error(soapFault.Body.Fault.Reason.Text.value, ex, "Error on response"); HttpContext.Current.Response.ContentType = "application/soap+xml"; HttpContext.Current.Response.Write(soapFaultXml.InnerXml); } } }
// Опис: Метод кој овозможува процесирање на НТТР Web повици // Влезни параметри: HttpContext context // Излезни параметри: / public void ProcessRequest(HttpContext context) { var transactionId = Guid.NewGuid(); var validTId = true; try { var urlSegments = _requestHelper.GetUrlSegments(context.Request.RawUrl); _logger.Info("context.Request.RawUrl: " + context.Request.RawUrl); const string ourMim = "MIM1$$"; const string secoundMim = "MIM2$$"; bool routingTokenContainOurMim = urlSegments.RoutingToken.Contains(ourMim); //_logger.Info("Go sodrzi nasiot Mim: " + routingTokenContainOurMim); bool routingTokenContainsSecoundMim = urlSegments.RoutingToken.Contains(secoundMim); //_logger.Info("Go sodrzi vtoriot Mim: " + routingTokenContainsSecoundMim); if (!routingTokenContainOurMim && !routingTokenContainsSecoundMim) { //Dodavame MIM1$$ na RountingToken ako istiot nema urlSegments.RoutingToken = "MIM1$$" + urlSegments.RoutingToken; //_logger.Info("Nas mim e, treba da dodade i sea Routing token e: " + urlSegments.RoutingToken); } var logUrlSegments = JsonConvert.SerializeObject(urlSegments); _logger.Info("urlSegments e: " + JsonConvert.SerializeObject(logUrlSegments) + "urlsegment: " + context.Request.RawUrl); var contentType = context.Request.ContentType; var action = contentType.Split(';').Last(); //_logger.Info("action e:" + action); var actionName = string.Empty; var executionMethodName = string.Empty; if (!string.IsNullOrEmpty(action)) { actionName = action.Substring(action.IndexOf('"') + 1); executionMethodName = actionName.Substring(0, actionName.Length - 1); } //_logger.Info("actionName e:" + actionName); //_logger.Info("executionMethodName e:" + executionMethodName); var soapBody = string.Empty; try { var logGetSoapBody = AppSettings.Get <bool>("LogGetSoapBody"); if (logGetSoapBody) { _logger.Info( "Pred da go zeme samo soap body od porakata " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeGetOnlySoapBody"); } soapBody = _requestHelper.GetOnlySoapBody(context.Request.InputStream); if (logGetSoapBody) { _logger.Info( "Otkako kje se zeme samo soap body od porakata " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterGetOnlySoapBody"); } _logger.Info("soapBody e: " + soapBody); } catch (Exception ex) { _logger.Error("Nastanata e greska kaj GetOnlySoapBody", ex); } var logCreateMimRequestMsg = AppSettings.Get <bool>("LogCreateMimRequestMsg"); if (logCreateMimRequestMsg) { _logger.Info("Pred CreateMimRequestMsg " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeCreateMimRequestMsg"); } var mimMsg = _mimMsgHelper.CreateMimRequestMsg(urlSegments, transactionId.ToString()); if (logCreateMimRequestMsg) { _logger.Info("Posle CreateMimRequestMsg " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterCreateMimRequestMsg"); } #region Log SOAP Request Message var logSoap = AppSettings.Get <bool>("LogSoap"); if (logSoap) { _logger.Info(soapBody + Environment.NewLine + "ContentType: " + contentType + Environment.NewLine + "Soap action: " + actionName); } #endregion if (string.IsNullOrEmpty(soapBody) || !urlSegments.IsUrlCorrrect) { validTId = false; context.Response.StatusCode = 400; context.Response.End(); } #region Log MIM Message var logInsertRequestLogInDb = AppSettings.Get <bool>("LogInsertRequestLogInDb"); if (logInsertRequestLogInDb) { _logger.Info("Pred LogInitialMimMessage " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeLogInitialMimMessage"); } _mimMsgHelper.LogInitialMimMessage(mimMsg, _logger); if (logInsertRequestLogInDb) { _logger.Info("Posle LogInitialMimMessage " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterLogInitialMimMessage"); } #endregion if (urlSegments.Async) { //TODO Async req } var logLoadOwnCertificate = AppSettings.Get <bool>("LogLoadOwnCertificate"); if (logLoadOwnCertificate) { _logger.Info("Pred LoadOwnCertificate " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeLoadOwnCertificate"); } var ownCert = _mimMsgHelper.LoadOwnCertificate(_logger); if (logLoadOwnCertificate) { _logger.Info("Posle LoadOwnCertificate " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterLoadOwnCertificate"); } var logGetPrivateKey = AppSettings.Get <bool>("LogGetPrivateKey"); if (logGetPrivateKey) { _logger.Info("Pred GetPrivateKey " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeGetPrivateKey"); } var privateKey = _mimMsgHelper.GetPrivateKey(ownCert.PrivateKey); if (logGetPrivateKey) { _logger.Info("Posle GetPrivateKey " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterGetPrivateKey"); } string original = soapBody; var logGetPublicKeyForProvider = AppSettings.Get <bool>("LogGetPublicKeyForProvider"); if (logGetPublicKeyForProvider) { _logger.Info("Pred GetPublicKeyForProvider " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeGetPublicKeyForProvider"); } var publicKey = _mimMsgHelper.GetPublicKeyForProvider(urlSegments.RoutingToken); if (logGetPublicKeyForProvider) { _logger.Info( "Posle GetPublicKeyForProvider " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterGetPublicKeyForProvider"); } var logEncryption = AppSettings.Get <bool>("LogEncryption"); if (logEncryption) { _logger.Info( "Pred da go enkriptira body koe kje se isprati vo requestot " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeEncryptRequest"); } var encryptedBlock = _mimMsgHelper.EncryptSoapBody(original, publicKey.PublicKeyRsa); if (logEncryption) { _logger.Info( "Otkako kje go enkriptira body koe kje se isprati vo requestot " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterEncryptRequest"); } //var soapMethodName = _requestHelper.GetSoapMethodName(soapBody); #region Create MIM Message //set values to missing properties mimMsg.Body.MimBody.Message = Convert.ToBase64String(encryptedBlock.EncryptedData); mimMsg.Header.CryptoHeader.Key = Convert.ToBase64String(encryptedBlock.EncryptedSessionKey); mimMsg.Header.CryptoHeader.InitializationVector = Convert.ToBase64String(encryptedBlock.Iv); mimMsg.Header.MimHeader.ServiceMethod = executionMethodName; mimMsg.Header.MimHeader.PublicKey = ownCert.CertString; _logger.Info("mimMsg.Header.MimHeader.PublicKey is: " + ownCert.CertString); var logCreateMimXmlMsg = AppSettings.Get <bool>("LogCreateMimXmlMsg"); if (logCreateMimXmlMsg) { _logger.Info("Pred CreateMimXmlMsg " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeCreateMimXmlMsg"); } var doc = _mimMsgHelper.CreateMimXmlMsg(mimMsg); if (logCreateMimXmlMsg) { _logger.Info("Posle CreateMimXmlMsg " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterACreateMimXmlMsg"); } //_logger.Info("MIM message before KIBS" + doc); try { KIBSResponse resultkibs = null; if (mimMsg.Header.MimAdditionalHeader.IsInteropTestCommunicationCall) { resultkibs = new KIBSResponse { Hash = "InteropTestCommunicationCallHash" }; } else { if (AppSettings.Get <string>("KIBSEnviroment") != null) { if (AppSettings.Get <string>("KIBSEnviroment") == "Test") { var logKibsTimestamp = AppSettings.Get <bool>("LogKIBS"); if (logKibsTimestamp) { _logger.Info("Se koristi testen KIBS."); } var requestBeforeKibs = DateTime.Now; if (logKibsTimestamp) { _logger.Info( "Pred request ." + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "KIBSPredRequest"); } resultkibs = KIBS.KIBS.GenerateTimeStamp(doc.ToString()); if (logKibsTimestamp) { _logger.Info( "Pred request ." + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "KIBSPosleRequest"); var totalMinRequestKibs = (int)(DateTime.Now - requestBeforeKibs).TotalMinutes; var totalSecRequestKibs = (int)(DateTime.Now - requestBeforeKibs).TotalSeconds; var totalMilisecRequestKibs = (int)(DateTime.Now - requestBeforeKibs).TotalMilliseconds; _logger.Info( "Kibs ni vratil odgovor za " + totalMinRequestKibs + " min " + totalSecRequestKibs + " sec " + totalMilisecRequestKibs + " miliseconds", "RequestKIBS"); } } if (AppSettings.Get <string>("KIBSEnviroment") == "Production") { _logger.Info("Se koristi produkciski KIBS."); resultkibs = KIBS.KIBS.GenerateTimeStampProduction(doc.ToString()); } } } try { //resultkibs = new KIBSResponse //{ // Hash = "InteropTestCommunicationCallHash", // TimeStamp = DateTime.Now //}; if (resultkibs != null) { //_logger.Info("Pred update message log: " + mimMsg.Header.MimHeader.Dir + "/" + mimMsg.Header.MimHeader.ServiceMethod + "/" + mimMsg.Header.MimHeader.PublicKey + "/" + mimMsg.Header.MimHeader.TransactionId); //Prethodno se zemashe vrednosta Timestamp od servisot na KIBS, i istata se zapisuvase vo baza //Sega se zapishuva DateTime.Now vo poleto Timestamp // _messageLogsRepository.UpdateMessageLog(mimMsg.Header.MimHeader.Dir, resultkibs.TimeStamp, //resultkibs.Hash, mimMsg.Header.MimHeader.ServiceMethod, mimMsg.Header.MimHeader.PublicKey, //mimMsg.Header.MimHeader.TransactionId); var logUpdateMessageLog = AppSettings.Get <bool>("LogUpdateMessageLog"); if (logUpdateMessageLog) { _logger.Info( "Pred UpdateMessageLog " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeUpdateMessageLog"); } _messageLogsRepository.UpdateMessageLog(mimMsg.Header.MimHeader.Dir, resultkibs.Hash, mimMsg.Header.MimHeader.ServiceMethod, mimMsg.Header.MimHeader.PublicKey, mimMsg.Header.MimHeader.TransactionId); if (logUpdateMessageLog) { _logger.Info( "Posle UpdateMessageLog " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterUpdateMessageLog"); } //mimMsg.Header.MimHeader.TimeStamp = resultkibs.TimeStamp; //.ToString(); mimMsg.Header.MimHeader.TimeStamp = DateTime.Now; mimMsg.Header.MimAdditionalHeader.TimeStampToken = resultkibs.Hash; //_logger.Info("posle kibs so result: " + resultkibs.TimeStamp); } } catch (Exception exception) { _logger.Error("Error while updating mim message: ", exception); throw new Exception("Неуспешна комуникација со KIBS!"); } } catch (Exception ex) { _logger.Info("KIBS error posle CreateMimRequestMsg: " + ex.Message); throw new Exception("KIBS врати грешка!"); } var logCreateMimSignedXmlMsg = AppSettings.Get <bool>("LogCreateMimSignedXmlMsg"); if (logCreateMimSignedXmlMsg) { _logger.Info("Pred CreateMimSignedXmlMsg " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeCreateMimSignedXmlMsg"); } var mimMsgXml = _mimMsgHelper.CreateMimSignedXmlMsg(mimMsg, ownCert, _logger); if (logCreateMimSignedXmlMsg) { _logger.Info("Posle CreateMimSignedXmlMsg " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterCreateMimSignedXmlMsg"); } //_logger.Info("Created MIM signed xml message: " + mimMsgXml); #endregion var urlToBizTalk = AppSettings.Get <string>("URLWebRequest"); ResponseInteropCommunication responseBizTalk = null; try { //_logger.Info("pred responseBizTalk urlToBizTalk" + urlToBizTalk); var timeBeforeCallBizTalk = DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"); responseBizTalk = _soapRequestHelper.Execute(mimMsgXml, contentType, urlToBizTalk, _logger); _logger.Info( "Calling BizTalk in " + timeBeforeCallBizTalk + " , receving response in " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BizTalkResponseTime"); //Real MIM message var logUnwrapSoapFaultMessage = AppSettings.Get <bool>("LogUnwrapSoapFaultMessage"); if (logUnwrapSoapFaultMessage) { _logger.Info( "Pred UnwrapSoapFaultMessage " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeUnwrapSoapFaultMessage"); } var soapFaultUnwrapped = _soapRequestHelper.UnwrapSoapFaultMessage(responseBizTalk.Response); if (logUnwrapSoapFaultMessage) { _logger.Info( "Posle UnwrapSoapFaultMessage " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterUnwrapSoapFaultMessage"); } //_logger.Info("Pominal kaj soapFaultUnwrapped!"); _logger.Info(responseBizTalk.Response, "BTResponseReceived"); if (soapFaultUnwrapped.Body.Fault != null) { // BizzTalk error if (soapFaultUnwrapped.Body.Fault.Code.Subcode.value == "10000") { if (soapFaultUnwrapped.Body.Fault.Code.value == "10001") { throw new Exception("BTMstatus10000BTMend;" + AppSettings.Get <string>("SoapFaultAccessMapping")); } else if (soapFaultUnwrapped.Body.Fault.Code.value == "10002") { throw new Exception("BTMstatus10000BTMend;" + AppSettings.Get <string>("SoapFaultParticipantInactive")); } else if (soapFaultUnwrapped.Body.Fault.Code.value == "10003") { throw new Exception("BTMstatus10000BTMend;" + AppSettings.Get <string>("SoapFaultServiceUnReachable")); } else if (soapFaultUnwrapped.Body.Fault.Code.value == "10004") { throw new Exception("BTMstatus10000BTMend;" + AppSettings.Get <string>("SoapFaultKIBSUnReachable")); } else if (soapFaultUnwrapped.Body.Fault.Code.value == "10005") { throw new Exception("BTMstatus10000BTMend;" + soapFaultUnwrapped.Body.Fault.Reason.Text.value); } else if (soapFaultUnwrapped.Body.Fault.Code.value == "10010") { throw new Exception("BTMstatus10000BTMend;" + soapFaultUnwrapped.Body.Fault.Reason.Text.value); } else if (soapFaultUnwrapped.Body.Fault.Code.value == "10007") { throw new Exception("BTMstatus10000BTMend;" + AppSettings.Get <string>("SoapFaultUnsuccessfulRequest")); } else if (soapFaultUnwrapped.Body.Fault.Code.value == "10000") { //ova e vo slucaj koga CC-to e nedostapno throw new Exception("BTMstatus10000BTMend;" + AppSettings.Get <string>("SoapFaultServiceUnReachable")); } throw new Exception("BTMstatus10000BTMend;" + soapFaultUnwrapped.Body.Fault.Reason.Text.value); } // Our error else { throw new Exception(soapFaultUnwrapped.Body.Fault.Reason.Text.value); } } } catch (Exception e) { _logger.Error("Greska vo povikot do BizTalk", e); throw new Exception(e.Message); } var logUnwrapMimMessage = AppSettings.Get <bool>("LogUnwrapMimMessage"); if (logUnwrapMimMessage) { _logger.Info("Pred UnwrapMimMessage " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeUnwrapMimMessage"); } var mimMsgResponse = _soapRequestHelper.UnwrapMimMessage(responseBizTalk.Response); if (logUnwrapMimMessage) { _logger.Info("Posle UnwrapMimMessage " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterUnwrapMimMessage"); } #region Log MIM Message var logMimMessage = AppSettings.Get <bool>("LogMimMessage"); if (logMimMessage) { _logger.Info("Pred LogMimMessage " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeLogMimMessage"); } _mimMsgHelper.LogMimMessage(mimMsgResponse, _logger); if (logMimMessage) { _logger.Info("posle LogMimMessage " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterLogMimMessage"); } #endregion #region ValidateMsg try { var logValidateSignature = AppSettings.Get <bool>("LogValidateSignature"); if (logValidateSignature) { _logger.Info("Pred ValidateSignature " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeValidateSignature"); _logger.Info("Own cert string " + ownCert.CertString, "OwnCertString"); } if (_soapRequestHelper.ValidateSignature(responseBizTalk.Response, ownCert.CertString, _logger)) { if (logValidateSignature) { _logger.Info( "Posle ValidateSignature " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterValidateSignature"); } var logValidateXml = AppSettings.Get <bool>("LogValidateXml"); if (logValidateXml) { _logger.Info("Pred ValidateXml " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeValidateXml"); } _validXmlMsgHelper.ValidateXml(responseBizTalk.Response); if (logValidateXml) { _logger.Info("Posle ValidateXml " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterValidateXml"); } } } catch (Exception ex) { _logger.Error("Nastanala greska kaj ValidateSignature", ex); } #endregion var symmetricKey = mimMsgResponse.Header.CryptoHeader.Key; var iVector = mimMsgResponse.Header.CryptoHeader.InitializationVector; var decryptBody = string.Empty; try { //_logger.Info("symmetricKey" + symmetricKey); //_logger.Info("iVector" + iVector); if (logEncryption) { _logger.Info( "Pred da go dekriptira body koe kje se vrati kako response " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeDecryptResponse"); } decryptBody = _mimMsgHelper.DecryptSoapBody( Convert.FromBase64String(mimMsgResponse.Body.MimBody.Message), Convert.FromBase64String(symmetricKey), Convert.FromBase64String(iVector), privateKey); if (logEncryption) { _logger.Info( "Otkako kje go dekriptira body koe kje se vrati kako response " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterDecryptResponse"); } } catch (Exception ex) { _logger.Error("Nastanala greska kaj DecryptSoapBody", ex); } #region Log DecryptBody if (AppSettings.Get <bool>("LogDecryptBody")) { _logger.Info("Decripting MIM message: " + decryptBody); } #endregion #region KIBS after BT try { KIBSResponse resultkibsAfterBt = null; if (mimMsgResponse.Header.MimAdditionalHeader.IsInteropTestCommunicationCall) { resultkibsAfterBt = new KIBSResponse { Hash = "InteropTestCommunicationCallHash" }; } else { if (AppSettings.Get <string>("KIBSEnviroment") != null) { if (AppSettings.Get <string>("KIBSEnviroment") == "Test") { var logKibsTimestamp = AppSettings.Get <bool>("LogKIBS"); if (logKibsTimestamp) { _logger.Info("Se koristi testen KIBS."); } var responseBeforeKibs = DateTime.Now; if (logKibsTimestamp) { _logger.Info( "Pred response ." + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "KIBSPredResponse"); } resultkibsAfterBt = KIBS.KIBS.GenerateTimeStamp(responseBizTalk.Response); if (logKibsTimestamp) { _logger.Info( "Posle response ." + DateTime.Now.ToString("dd.MM.yyy hh:mm:ss.fff tt"), "KIBSPosleResponse"); var totalMinRequestKibs = (int)(DateTime.Now - responseBeforeKibs).TotalMinutes; var totalSecRequestKibs = (int)(DateTime.Now - responseBeforeKibs).TotalSeconds; var totalMilisecRequestKibs = (int)(DateTime.Now - responseBeforeKibs).TotalMilliseconds; //TimeSpan a = DateTime.Now - responseBeforeKibs; //int b = a.Seconds; //int c = a.Milliseconds; //int d = a.Minutes; //_logger.Info("minuti ima " + d, "minuti"); //_logger.Info("sekindi ima " + b, "sekundi"); //_logger.Info("milisekunds ima " + c, "milisekunds"); _logger.Info( "Kibs ni vratil odgovor za " + totalMinRequestKibs + " min " + totalSecRequestKibs + " sec " + totalMilisecRequestKibs + " miliseconds", "ResponseKIBS"); } } if (AppSettings.Get <string>("KIBSEnviroment") == "Production") { _logger.Info("Se koristi produkciski KIBS."); resultkibsAfterBt = KIBS.KIBS.GenerateTimeStampProduction(responseBizTalk.Response); } } } try { //Prethodno se zemashe vrednosta Timestamp od servisot na KIBS, i istata se zapisuvase vo baza //Sega se zapishuva DateTime.Now vo poleto Timestamp //_messageLogsRepository.UpdateMessageLog(mimMsgResponse.Header.MimHeader.Dir, // resultkibsAfterBt.TimeStamp, resultkibsAfterBt.Hash, string.Empty, string.Empty, // mimMsg.Header.MimHeader.TransactionId); var logUpdateMessageLogResponse = AppSettings.Get <bool>("LogUpdateMessageLogResponse"); if (logUpdateMessageLogResponse) { _logger.Info( "Pred UpdateMessageLog " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "BeforeUpdateMessageLogResponse"); } _messageLogsRepository.UpdateMessageLog(mimMsgResponse.Header.MimHeader.Dir, resultkibsAfterBt.Hash, string.Empty, string.Empty, mimMsg.Header.MimHeader.TransactionId); if (logUpdateMessageLogResponse) { _logger.Info( "Posle UpdateMessageLog " + DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss.fff tt"), "AfterUpdateMessageLogResponse"); } //Prethodno se zemashe vrednosta Timestamp od servisot na KIBS, i istata se zapisuvase vo baza //Sega se zapishuva DateTime.Now vo poleto Timestamp //mimMsgResponse.Header.MimHeader.TimeStamp = resultkibsAfterBt.TimeStamp; //.ToString(); mimMsgResponse.Header.MimHeader.TimeStamp = DateTime.Now; mimMsgResponse.Header.MimAdditionalHeader.TimeStampToken = resultkibsAfterBt.Hash; } catch (Exception exception) { _logger.Error("Error while updating mim message: ", exception); throw new Exception("Неуспешна комуникација со KIBS!"); } } catch (Exception ex) { _logger.Info("KIBS error after BT: " + ex.Message); throw new Exception("KIBS врати грешка!"); } #endregion #region Log SOAP Response Message if (logSoap) { _logger.Info(responseBizTalk.Response, "BizTalk response"); } #endregion string decryptedResponseBodyWrappedInSoapEnvelope = "<s:Envelope xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\"><s:Body>" + decryptBody + "</s:Body></s:Envelope>"; //_logger.Info(decryptedResponseBodyWrappedInSoapEnvelope, "decryptedResponseBodyWrappedInSoapEnvelope"); _logger.Info("Zavsilo se na External handler vo " + DateTime.Now + " casot.", "EndedOnExternalHandler"); HttpContext.Current.Response.ContentType = "application/soap+xml"; context.Response.Write(decryptedResponseBodyWrappedInSoapEnvelope); } catch (Exception ex) { //AccessMap=0;Status=;StatusDescription="";IsActive=1;IsExternal=1;Uri="http://internalHandler-fpiom/";KIBS=True; if (validTId) { var soapFault = new SoapFaultMessage(); if (ex.Message.StartsWith("BTMstatus10000BTMend")) { // BizzTalk error handled - Custom //var soapFaultError = _soapRequestHelper.BTsoapFault(ex.Message); // BizzTalk error handled - Kornel var soapFaultError = ex.Message.Split(';')[1]; soapFault = _mimMsgHelper.CreateSoapFault("Code value", "Code - SubCode value", "Details - MaxTime value", soapFaultError); } else { soapFault = _mimMsgHelper.CreateSoapFault("Code value", "Code - SubCode value", "Details - MaxTime value", ex.Message); } _logger.Error("Generalen exception", ex); _logger.Error(soapFault.Body.Fault.Reason.Text.value, ex, "Error on response"); var soapFaultDB = _soapRequestHelper.CreateSoapFaultDB(transactionId, soapFault.Body.Fault.Code.value, soapFault.Body.Fault.Code.Subcode.value, soapFault.Body.Fault.Detail.maxTime, soapFault.Body.Fault.Reason.Text.value); _soapFaultRepo.InsertSoapFault(soapFaultDB); var soapFaultXml = _mimMsgHelper.CreateFaultMessage(soapFault); HttpContext.Current.Response.ContentType = "application/soap+xml"; HttpContext.Current.Response.Write(soapFaultXml.InnerXml); } } }
// Опис: Метод кој овозможува процесирање на НТТР Web повици // Влезни параметри: HttpContext context // Излезни параметри: / public void ProcessRequest(HttpContext context) { var validTId = false; var transactionId = new Guid(); try { var soapBody = _requestHelper.GetSoapBody(context.Request.InputStream); var contentType = context.Request.ContentType; var soapHeader = _requestHelper.GetSoapHeader(context.Request.Headers); #region Log SOAP Request Message var logSoap = AppSettings.Get <bool>("LogSoap"); if (logSoap) { _logger.Info(soapBody + Environment.NewLine + "ContentType: " + contentType + Environment.NewLine + "SoapHeader: " + soapHeader, "Request to Internal handler"); } //soapBody = File.ReadAllText(@"C:\NSRequest.txt"); ; #endregion if (string.IsNullOrEmpty(soapBody)) { context.Response.StatusCode = 400; context.Response.End(); } var mimMsg = _soapRequestHelper.UnwrapMimMessage(soapBody); validTId = true; transactionId = new Guid(mimMsg.Header.MimHeader.TransactionId); #region Log MIM Message _mimMsgHelper.LogMimMessage(mimMsg, _logger); #endregion var ownCert = _mimMsgHelper.LoadOwnCertificate(_logger); var privateKey = _mimMsgHelper.GetPrivateKey(ownCert.PrivateKey); var publicKey = mimMsg.Header.MimHeader.PublicKey; if (_soapRequestHelper.ValidateSignature(soapBody, publicKey, _logger)) { _validXmlMsgHelper.ValidateXml(soapBody); } var symmetricKey = mimMsg.Header.CryptoHeader.Key; var iVector = mimMsg.Header.CryptoHeader.InitializationVector; var decryptBody = _mimMsgHelper.DecryptSoapBody(Convert.FromBase64String(mimMsg.Body.MimBody.Message.ToString()), Convert.FromBase64String(symmetricKey), Convert.FromBase64String(iVector), privateKey); #region Log DecryptBody if (AppSettings.Get <bool>("LogDecryptBody")) { _logger.Info("Decripting MIM message: " + decryptBody); } #endregion #region KIBS after DecryptSoapBody try { KIBSResponse resultkibs = null; if (mimMsg.Header.MimAdditionalHeader.IsInteropTestCommunicationCall) { resultkibs = new KIBSResponse { Hash = "InteropTestCommunicationCallHash" }; } else { if (AppSettings.Get <string>("KIBSEnviroment") != null) { if (AppSettings.Get <string>("KIBSEnviroment") == "Test") { _logger.Info("Se koristi testen KIBS."); resultkibs = KIBS.KIBS.GenerateTimeStamp(soapBody); } if (AppSettings.Get <string>("KIBSEnviroment") == "Production") { _logger.Info("Se koristi produkciski KIBS."); resultkibs = KIBS.KIBS.GenerateTimeStampProduction(soapBody); } } //resultkibs = new KIBSResponse //{ // Hash = "InteropTestCommunicationCallHash", // TimeStamp = DateTime.Now //}; } try { if (resultkibs != null) { //Prethodno se zemashe vrednosta Timestamp od servisot na KIBS, i istata se zapisuvase vo baza //Sega se zapishuva DateTime.Now vo poleto Timestamp //_messageLogsRepository.UpdateMessageLog(mimMsg.Header.MimHeader.Dir, resultkibs.TimeStamp, // resultkibs.Hash, string.Empty, string.Empty, mimMsg.Header.MimHeader.TransactionId); _messageLogsRepository.UpdateMessageLog(mimMsg.Header.MimHeader.Dir, resultkibs.Hash, string.Empty, string.Empty, mimMsg.Header.MimHeader.TransactionId); //Prethodno se zemashe vrednosta Timestamp od servisot na KIBS, i istata se zapisuvase vo baza //Sega se zapishuva DateTime.Now vo poleto Timestamp //mimMsg.Header.MimHeader.TimeStamp = resultkibs.TimeStamp; //.ToString(); mimMsg.Header.MimHeader.TimeStamp = DateTime.Now; mimMsg.Header.MimAdditionalHeader.TimeStampToken = resultkibs.Hash; } } catch (Exception exception) { _logger.Error("Error while updating mim message: ", exception); throw new Exception("Неуспешна комуникација со KIBS!"); } } catch (Exception ex) { _logger.Info("KIBS error posle DecryptSoapBody: " + ex.Message); throw new Exception("KIBS врати грешка!"); } #endregion _logger.Info("posle LogMimMessage"); var urlToHostedApp = _requestHelper.GetServiceUrl(mimMsg.Header.MimHeader); _logger.Info("urlToHostedApp mimheader e: " + mimMsg.Header.MimHeader); _logger.Info("urlToHostedApp e: " + urlToHostedApp); #region ExecuteRequestToInstitution ResponseInteropCommunication responseEndPointInstitution; string decryptedRequestBodyWrappedInSoapEnvelope = "<s:Envelope xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\"><s:Body>" + decryptBody + "</s:Body></s:Envelope>"; if (mimMsg.Header.MimAdditionalHeader.IsInteropTestCommunicationCall) { responseEndPointInstitution = new ResponseInteropCommunication { Response = @"<s:Envelope xmlns:s=""http://www.w3.org/2003/05/soap-envelope""><s:Body><InteropTestCommunicationService xmlns=""http://tempuri.org/"">InteropTestCommunicationCallResponse</InteropTestCommunicationService></s:Body></s:Envelope>", MimeType = "InteropTestCommunicationCallMimeType" }; } else { try { _logger.Info("Povikot koj se prakja e: " + decryptedRequestBodyWrappedInSoapEnvelope); System.Net.ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);//sertifikatot ne im e u red za toa go stavam ova za da go ignorira //ovaa linija da se proveri za custom interop fault greski, od tuka pa natamu da se proveruva povikot responseEndPointInstitution = _soapRequestHelper.Execute(decryptedRequestBodyWrappedInSoapEnvelope, contentType, urlToHostedApp, _logger); //ovie dva loga ne gi pravi bidejki direktno odi na exception! _logger.Info("Response institution is: " + responseEndPointInstitution.Response); _logger.Info("Response institution bez envelope is: " + _requestHelper.GetOnlySoapBodyFromString(responseEndPointInstitution.Response)); } //tuka probaj stavi catch (FaultException e) da vidish shto kje vrati catch (FaultException ex) { _logger.Info("dosol vo fault exception."); _logger.Error("Error koj se vrakja od fault exception e: ", ex); _logger.Error("Error koj se vrakja od fault exception Message e: ", ex.Message); _logger.Error("Error koj se vrakja od fault exception inner exception e: ", ex.InnerException.Message); throw; } catch (Exception e) { _logger.Info("catch exception e: " + e.Message); throw new Exception("Сервисот кој го повикавте врати грешка!"); } } #endregion #region Create MIM Message var mimMsgResponse = _mimMsgHelper.CreateMimResponseMsg(mimMsg, responseEndPointInstitution.MimeType); #region Log MIM Message _mimMsgHelper.LogMimMessage(mimMsgResponse, _logger); #endregion string responseWithoutSoapEnvelope = _requestHelper.GetOnlySoapBodyFromString(responseEndPointInstitution.Response); var publicKeyRsa = _mimMsgHelper.GetPublicKeyFromString(publicKey); var encryptedBlock = _mimMsgHelper.EncryptSoapBody(responseWithoutSoapEnvelope, publicKeyRsa); var encryptedSoapBody = Convert.ToBase64String(encryptedBlock.EncryptedData); var encryptedSessionKey = Convert.ToBase64String(encryptedBlock.EncryptedSessionKey); var encriptedIVector = Convert.ToBase64String(encryptedBlock.Iv); mimMsgResponse.Body.MimBody.Message = encryptedSoapBody; mimMsgResponse.Header.CryptoHeader.InitializationVector = encriptedIVector; mimMsgResponse.Header.CryptoHeader.Key = encryptedSessionKey; var doc = _mimMsgHelper.CreateMimXmlMsg(mimMsgResponse); #region KIBS after CreateMimXmlMsg try { KIBSResponse resultkibsResp = null; if (mimMsgResponse.Header.MimAdditionalHeader.IsInteropTestCommunicationCall) { resultkibsResp = new KIBSResponse { Hash = "InteropTestCommunicationCallHash" }; } else { if (AppSettings.Get <string>("KIBSEnviroment") != null) { if (AppSettings.Get <string>("KIBSEnviroment") == "Test") { _logger.Info("Se koristi testen KIBS."); resultkibsResp = KIBS.KIBS.GenerateTimeStamp(doc.ToString()); } if (AppSettings.Get <string>("KIBSEnviroment") == "Production") { _logger.Info("Se koristi produkciski KIBS."); resultkibsResp = KIBS.KIBS.GenerateTimeStampProduction(doc.ToString()); } } //resultkibsResp = new KIBSResponse //{ // Hash = "InteropTestCommunicationCallHash", // TimeStamp = DateTime.Now //}; } try { if (resultkibsResp != null) { //Prethodno se zemashe vrednosta Timestamp od servisot na KIBS, i istata se zapisuvase vo baza //Sega se zapishuva DateTime.Now vo poleto Timestamp //_messageLogsRepository.UpdateMessageLog(mimMsgResponse.Header.MimHeader.Dir, resultkibsResp.TimeStamp, resultkibsResp.Hash, string.Empty, string.Empty, mimMsg.Header.MimHeader.TransactionId); _messageLogsRepository.UpdateMessageLog(mimMsgResponse.Header.MimHeader.Dir, resultkibsResp.Hash, string.Empty, string.Empty, mimMsg.Header.MimHeader.TransactionId); //Prethodno se zemashe vrednosta Timestamp od servisot na KIBS, i istata se zapisuvase vo baza //Sega se zapishuva DateTime.Now vo poleto Timestamp //mimMsgResponse.Header.MimHeader.TimeStamp = resultkibsResp.TimeStamp;//.ToString(); mimMsgResponse.Header.MimHeader.TimeStamp = DateTime.Now; mimMsgResponse.Header.MimAdditionalHeader.TimeStampToken = resultkibsResp.Hash; } } catch (Exception exception) { _logger.Info("KIBS error: " + exception.Message); throw new Exception("KIBS врати грешка: " + exception.Message); } } catch (Exception ex) { _logger.Info("KIBS error after CreateMimXmlMsg: " + ex.Message); throw new Exception("KIBS врати грешка: " + ex.Message); } #endregion var mimMsgResponseXml = _mimMsgHelper.CreateMimSignedXmlMsg(mimMsgResponse, ownCert, _logger); //Check for need of encryption #endregion #region Log SOAP Response Message if (logSoap) { //LogHelper.WriteInNLoc("", "", mimMsgResponseXml, "Response_" + DateTime.Now, "Info"); _logger.Info(mimMsgResponseXml, "Response"); } #endregion HttpContext.Current.Response.ContentType = "application/soap+xml"; context.Response.Write(mimMsgResponseXml); } catch (FaultException ex) { _logger.Info("dosol vo fault exception."); _logger.Error("Error koj se vrakja od fault exception e: ", ex); _logger.Info("validTID vo glavniot catch e: " + validTId); if (validTId) { var soapFault = _mimMsgHelper.CreateSoapFault("Code value", "Code - SubCode value", "Details - MaxTime value", ex.Message); var soapFaultDB = _soapRequestHelper.CreateSoapFaultDB(transactionId, soapFault.Body.Fault.Code.value, soapFault.Body.Fault.Code.Subcode.value, soapFault.Body.Fault.Detail.maxTime, soapFault.Body.Fault.Reason.Text.value); try { _soapFaultRepo.InsertSoapFault(soapFaultDB); } catch (Exception exception) { _logger.Error(exception, "Nastanata greska pri kreiranje na soap fault vo baza."); } var soapFaultXml = _mimMsgHelper.CreateFaultMessage(soapFault); _logger.Error(soapFault.Body.Fault.Reason.Text.value, ex, "Error on response"); HttpContext.Current.Response.ContentType = "application/soap+xml"; HttpContext.Current.Response.Write(soapFaultXml.InnerXml); } } catch (Exception ex) { _logger.Error("odma u catch", ex); _logger.Info("validTID vo glavniot catch e: " + validTId); if (validTId) { var soapFault = _mimMsgHelper.CreateSoapFault("Code value", "Code - SubCode value", "Details - MaxTime value", ex.Message); var soapFaultDb = _soapRequestHelper.CreateSoapFaultDB(transactionId, soapFault.Body.Fault.Code.value, soapFault.Body.Fault.Code.Subcode.value, soapFault.Body.Fault.Detail.maxTime, soapFault.Body.Fault.Reason.Text.value); try { _soapFaultRepo.InsertSoapFault(soapFaultDb); } catch (Exception exception) { _logger.Error(exception, "Nastanata greska pri kreiranje na soap fault vo baza."); } var soapFaultXml = _mimMsgHelper.CreateFaultMessage(soapFault); _logger.Error(soapFault.Body.Fault.Reason.Text.value, ex, "Error on response"); HttpContext.Current.Response.ContentType = "application/soap+xml"; HttpContext.Current.Response.Write(soapFaultXml.InnerXml); } } }