Я пишу обработчик, который создает два растровых изображения с помощью двух отдельных MemoryStreams, а затем возвращает одно из этих растровых изображений в качестве ответа ByteArrayContent.
К сожалению, независимо от того, какое растровое изображение я выбираю, ответ всегда является первым растровым изображением.
Например:
- stream1 инициализируется из byteArray1. image1 инициализируется из stream1.
- stream2 инициализируется из byteArray2. image2 инициализируется из stream2.
Я затем инициализирую finalImage из image1 или image2. После этого finalImage сохраняется в объекте FinalStream MemoryStream.
Затем finalStream возвращается как byteArray.
Примечание 1: Выше приведено только изображение image1. Даже если finalImage инициализируется с использованием image2.
Примечание 2: Если я удаляю весь код, относящийся к image1, изображение 2 возвращается, как и ожидалось.
Примечание 3: Этот блок кода в конечном итоге будет использоваться для возврата и image1, и image2 как объединенное изображение с двумя рядом друг с другом. К сожалению, это только когда-либо возвращало image1, поэтому мне пришлось реорганизовать код для дальнейшего изучения. Извиняюсь за беспорядок.
Примечание 4: Данные, возвращаемые GetTop5SuppliersChart, отличаются и могут быть видны по длине массива байтов.
Примечание 5: Я подумал, что это может быть проблема с кешированием, поэтому я попытался загрузить обработчик в режиме инкогнито и через разные браузеры без изменений в результате.
Приведенный ниже код был аннотирован длинами потоков
HttpResponse r = context.Response;
r.ContentType = "image/png";
byte[] byteArray1 = GetTop5SuppliersChart(brokerPerformanceEmailInformation, false);
//byteArray1.length is 22919
byte[] byteArray2 = GetTop5SuppliersChart(brokerPerformanceEmailInformation, true);
//byteArray2.length is 22375
Bitmap image1 = null;
Bitmap image2 = null;
byte[] chartImage = null;
using (MemoryStream stream1 = new MemoryStream(byteArray1))
{
//stream1.length is 22919
image1 = new Bitmap(stream1);
using (MemoryStream stream2 = new MemoryStream(byteArray2))
{
//stream2.length is 22375
image2 = new Bitmap(stream2);
using (MemoryStream finalStream = new MemoryStream())
{
var finalImage = new Bitmap(image2);
finalImage.Save(finalStream, System.Drawing.Imaging.ImageFormat.Png);
//finalStream.length is 127637
byteArrayToReturn= finalStream.ToArray();
}
}
}
r.Write(new ByteArrayContent(byteArrayToReturn));
Метод GetTop5SuppliersGraphData возвращает разные данные как для image1, так и для image2.
private byte[] GetTop5SuppliersChart(BrokerPerformanceEmailInformation emailInformation, bool showCurrentMonth)
{
var graphData = GetTop5SuppliersGraphData(emailInformation, showCurrentMonth);
var myChart = new System.Web.Helpers.Chart(chartwidth, chartHeight, GetPieTheme(false))
.AddSeries(chartType: "pie",
xValue: graphData.Series,
yValues: graphData.Values).Write();
var chartBytes = myChart.GetBytes();
return chartBytes;
}
Подводя итог:
Независимо от того, что используется для создания finalImage, byteArrayToReturn всегда будет возвращать image1.