using System; using System.Web; using System.Net; using System.Data; using System.Data.SqlClient; using System.Collections; using System.IO; using System.Text; using System.Web.Services; using System.Web.Services.Protocols; using System.Xml; /// /// YahooStockQuotes retrieves last traded price, last traded date, last traded time, and change for a comma-separated list of stock symbols /// [WebService(Namespace = "http://xxxxx.stei.com/")] //namespace has been altered to conceal implementation details [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class YahooStockQuotes : System.Web.Services.WebService { private String queryURL; private String stockSymbols; private String queryString; Char[] delims = { ',' }; public YahooStockQuotes() { DataSet stockQuoteConfigDataSet = null; FileStream stockQuoteConfigXML = null; try { //create a DataSet object to hold configuration settings stockQuoteConfigDataSet = new DataSet(); //set path to config file string stockQuoteConfigFilePath = "x:\\Sites\\YahooQuotes\\YahooStockQuoteConfig.xml"; //path has been altered to conceal implementation details //open file for reading stockQuoteConfigXML = new FileStream(stockQuoteConfigFilePath, FileMode.Open); //read XML schema and data into DataSet object stockQuoteConfigDataSet.ReadXml(stockQuoteConfigXML); //load retrieved data into their global variables queryURL = stockQuoteConfigDataSet.Tables[0].Rows[0]["queryurl"].ToString(); stockSymbols = stockQuoteConfigDataSet.Tables[0].Rows[0]["symbollist"].ToString(); queryString = stockQuoteConfigDataSet.Tables[0].Rows[0]["querystring"].ToString(); } catch (Exception xmlExc) { queryURL = null; stockSymbols = null; queryString = null; } finally { //close file stockQuoteConfigXML.Close(); } } [WebMethod] public DataSet GetStockQuotes() { //initialize a DataSet to contain stock quotes DataSet stockQuoteDataSet = new DataSet(); //create a table within the DataSet stockQuoteDataSet.Tables.Add("StockQuotes"); //create table columns stockQuoteDataSet.Tables["StockQuotes"].Columns.Add("Symbol"); stockQuoteDataSet.Tables["StockQuotes"].Columns.Add("Last_Traded_Price"); stockQuoteDataSet.Tables["StockQuotes"].Columns.Add("Last_Traded_Date"); stockQuoteDataSet.Tables["StockQuotes"].Columns.Add("Last_Traded_Time"); stockQuoteDataSet.Tables["StockQuotes"].Columns.Add("Change"); //parse symbol list into an array String[] stockSymbolList = stockSymbols.Split(delims); //iterate through stock symbol array and get data for each symbol; if an exception occurs, return an empty DataSet try { foreach (string stockSymbol in stockSymbolList) { //read response stream into a string (comma-delimited) String quote = getStockQuote(stockSymbol); //split string into an array String[] quoteDataItems = quote.Split(delims); //create and populate a DataRow object DataRow stockDataRow = stockQuoteDataSet.Tables["StockQuotes"].NewRow(); Char[] quoteMarks = { '"' }; stockDataRow["Symbol"] = quoteDataItems[0].ToString().Trim(quoteMarks); stockDataRow["Last_Traded_Price"] = "$ " + quoteDataItems[1].ToString().Trim(quoteMarks); stockDataRow["Last_Traded_Date"] = quoteDataItems[2].ToString().Trim(quoteMarks); stockDataRow["Last_Traded_Time"] = quoteDataItems[3].ToString().Trim(quoteMarks); stockDataRow["Change"] = quoteDataItems[4].ToString().Trim(quoteMarks); //add DataRow to the StockQuotes table in the DataSet object stockQuoteDataSet.Tables["StockQuotes"].Rows.Add(stockDataRow); } } catch (Exception sqExc) { stockQuoteDataSet.Tables["StockQuotes"].EndLoadData(); } return stockQuoteDataSet; } private string getStockQuote(string stockSymbol) { String requestURL = queryURL.ToString() + "?s=" + stockSymbol.ToString() + "&f=" + queryString.ToString(); WebClient yahooStockDataReq = new WebClient(); Byte[] yahooStockDataResp = yahooStockDataReq.DownloadData(requestURL); UTF8Encoding yahooStockDataConv = new UTF8Encoding(); String yahooStockData = yahooStockDataConv.GetString(yahooStockDataResp); return yahooStockData; } }