private string BuildHeader(MultipleTimeSeries multi)
        {
            string[] fields = new[]
            {
                "RunNumber","NetworkElement","RecordingElement","RecordingVariable",
                "Units","StartDate","EndDate","NoDataValue",
                "Min","Mean","Max","Sum","TimeStep"
            };

            StringBuilder result = new StringBuilder();
            foreach (string field in fields)
            {
                string[] values = multi.TimeSeries.Select(ts => SafeGet(ts, field)).ToArray();
                if (values.All(v => v == "-")) continue;

                string line = field + ",";
                string ditto = "...";
                if ((values.Length>1)&&(values.Distinct().Count() == 1)&&(values[0].Length>ditto.Length))
                {
                    line += values[0] + ',';
                    line += string.Join(",", Enumerable.Repeat(ditto, values.Length - 1));
                }
                else
                {
                    line += String.Join(",", values);
                }
                result.AppendLine(line);
            }

            return result.ToString();
        }
        public Message CSVMessage(MessageVersion messageVersion, TimeSeriesResponse origResult)
        {
            MultipleTimeSeries result = null;
            if (origResult is MultipleTimeSeries)
                result = (MultipleTimeSeries) origResult;
            else if (origResult is TimeSeriesFullSummary)
                result = new MultipleTimeSeries(origResult as TimeSeriesFullSummary);
            else // SimpleTimeSeries
                result = new MultipleTimeSeries(((SimpleTimeSeries) origResult).Slim());

            StringBuilder sb = new StringBuilder();
            sb.Append(BuildHeader(result));
            sb.AppendLine("-----------------------");
            sb.Append(BuildBody(result));

            Message reply = Message.CreateMessage(messageVersion, null, new RawBodyWriter(sb.ToString()));
            reply.Properties.Add(WebBodyFormatMessageProperty.Name,
                new WebBodyFormatMessageProperty(WebContentFormat.Raw));
            HttpResponseMessageProperty httpResp = new HttpResponseMessageProperty();
            reply.Properties.Add(HttpResponseMessageProperty.Name, httpResp);
            httpResp.Headers[HttpResponseHeader.ContentType] = "text/csv";
            return reply;
        }
        private string BuildBody(MultipleTimeSeries multi)
        {
            SlimTimeSeries refTS = multi.TimeSeries[0] as SlimTimeSeries;
            if (refTS == null)
            {
                return "";
            }

            StringBuilder result = new StringBuilder();

            // Assumes
            // * If the first time series has values, then all have values
            // * all time series are the same length
            int len = refTS.Values.Length;

            for (int i = 0; i < len; i++)
            {
                string line = refTS.DateForTimeStep(i)+",";
                line += String.Join(",", multi.TimeSeries.OfType<SlimTimeSeries>().Select(ts => ts.Values[i]));
                result.AppendLine(line);
            }

            return result.ToString();
        }