/// <summary> /// Method, that analyze the request and generate requested data /// </summary> /// <param name="ar">IAsyncResult</param> public static void ReadCallback(IAsyncResult ar) { String content = String.Empty; ClassWebService CWS = new ClassWebService(); DollarRates CDR = CWS.GetCurrencyFromOpenExchangeRate(); // Retrieve the state object and the handler socket // from the asynchronous state object. StateObject state = (StateObject)ar.AsyncState; Socket handler = state.workSocket; // Read data from the client socket. int bytesRead = handler.EndReceive(ar); if (bytesRead > 0) { // There might be more data, so store the data received so far. state.sb.Append(Encoding.ASCII.GetString( state.buffer, 0, bytesRead)); // Check for end-of-file tag. If it is not there, read // more data. content = state.sb.ToString(); if (content.IndexOf("<EOF>") > -1) { // All the data has been read from the // client. Display it on the console. Console.WriteLine("Read {0} bytes from socket. \n Data : {1}", content.Length, content); // Echo requested data back to the client. if (content == "OE<EOF>") { string response = RateListToString(CDR); Send(handler, response); } else if (content.IndexOf("<EOF>") == 3) { string country = content.Substring(0, 3); string response = CDR.GetRateFromCountryCode(country); Send(handler, response); } // Echo the data back to the client. else { Send(handler, content); } } else { // Not all data received. Get more. handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state); } } }
/// <summary> /// Method, that converts a Rates Dicttionary into a Semicolon separated string /// </summary> /// <param name="CDR">DollarRates</param> /// <returns>string</returns> private static string RateListToString(DollarRates CDR) { string sdr = ""; foreach (var item in CDR.rates) { sdr += item.Key + ";" + item.Value.ToString() + ";"; } string result = sdr.Remove(sdr.ToString().LastIndexOf(";"), 1); return(result); }