public static async Task <string> SendSoapMessage(string url, string method, LoanRequest request) { HttpClientHandler handler = new HttpClientHandler(); //Creates a new HttpClientHandler. handler.UseDefaultCredentials = true; //true if the default credentials are used; otherwise false. will use authentication credentials from the logged on user on your pc. using (HttpClient client = new HttpClient(handler)) { client.BaseAddress = new Uri(url); var values = new Dictionary <string, string> { { "ssn", request.ssn }, { "creditScore", request.creditScore.ToString() }, { "loanAmount", request.loanAmount.ToString() }, { "loanDuration", request.loanDuration } }; var content = new FormUrlEncodedContent(values); var response = await client.PostAsync(method, content).ConfigureAwait(continueOnCapturedContext: false);; response.EnsureSuccessStatusCode(); var responseString = await response.Content.ReadAsStringAsync(); return(responseString); } }
public static string GetXMLFromLoanRequest(LoanRequest request) { var serializer = new System.Xml.Serialization.XmlSerializer(typeof(LoanRequest)); string xml = ""; using (var sww = new StringWriter()) { using (XmlWriter writer = XmlWriter.Create(sww)) { serializer.Serialize(writer, request); xml = sww.ToString(); // Your XML return(xml); } } }
public static string GetJSONFromRequest(LoanRequest request) { MemoryStream stream1 = new MemoryStream(); DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(LoanRequest)); // Save original string before we work. string originalDurationString = request.loanDuration; // As JSON banks use days instead of Date from 1970, we convert it. string durationString = request.loanDuration.Replace("CET", "").Trim(); DateTime durationDate = Convert.ToDateTime(durationString); var duration = durationDate - new DateTime(1970, 01, 01); request.loanDuration = duration.TotalDays.ToString(); ser.WriteObject(stream1, request); stream1.Position = 0; StreamReader sr = new StreamReader(stream1); string jsonRequest = sr.ReadToEnd(); request.loanDuration = originalDurationString; //jsonRequest = jsonRequest.Replace(":\"", ":").Replace("\",", ",").Replace("\"}", "}"); return(jsonRequest); }
public string RequestLoan(string ssn, bool isInRKI, double loanAmount, int loanDurationInDays) { Dictionary <string, string> recievedResponses = new Dictionary <string, string>(); if (ssn.Length != 11 && ssn[6] != '-') { return("ssn MUST be in the format XXXXXX-XXXX"); } DateTime loanDuration = new DateTime(1970, 01, 01); loanDuration = loanDuration.AddDays(loanDurationInDays); // Get Creditscore from webservice var creditBureau = new CreditBureau.CreditScoreService(); int creditScore = creditBureau.creditScore(ssn); ssn = ssn.Replace("-", ""); // Get Banks from rulebase var rulebase = new RuleBase.RuleBase(); var recipientList = rulebase.GetBanks(creditScore, isInRKI, loanAmount, loanDuration).ToList(); if (recipientList.Count == 0) { return("No suitable banks :("); } var request = new LoanRequest(ssn, creditScore, loanAmount, loanDuration); // Translate and send. foreach (var bank in recipientList) { string queueForBank = ssn + "." + bank.Name; if (bank.UsesMessaging) { // Use AMQP Messaging protocol (RabbitMQ broker) MessageSender.DeclareQueue(bank.Host, queueForBank); if (bank.Exchange.Contains("XML")) { // XML Translator is used var encodedMessage = UTF8Encoding.UTF8.GetBytes(XMLConverter.GetXMLFromLoanRequest(request)); MessageSender.SendMessage(bank.Host, bank.Exchange, queueForBank, encodedMessage); } else if (bank.Exchange.Contains("JSON")) { // JSON Translator is used string json = JSONConverter.GetJSONFromRequest(request); var encodedMessage = UTF8Encoding.UTF8.GetBytes(json); MessageSender.SendMessage(bank.Host, bank.Exchange, queueForBank, encodedMessage); } } else { // Use http request to contact soap webservice. var myResponse = DynamicSoapRequestHandler.SendSoapMessage(bank.Host, "RequestLoan", request).Result; recievedResponses.Add(bank.Name, myResponse); } } // Recieve messages foreach (var bank in recipientList) { if (bank.UsesMessaging) { string queueForBank = ssn + "." + bank.Name; string response = MessageReciever.Recieve(bank.Host, queueForBank); recievedResponses.Add(bank.Name, response); } } if (recievedResponses.Count == 0) { return("No banks responded. This could be a connection error!"); } // Normalize Dictionary <string, LoanResponse> responses = Normalizer.Normalize(recievedResponses); // Uses translators to get LoanResponse objects //Aggregate to find best rate. string bestInterestInformation = Aggregator.FindBestInterestRate(responses); return(bestInterestInformation); }