我开发了一个“简单”的测试用例:
[HttpPost]
[Route("GetImage")]
public HttpResponseMessage GetImage()
{
try
{
int bmpX = 50;
int bmpY = 50;
DrawingVisual drawingVisual = new DrawingVisual();
var dc = drawingVisual.RenderOpen();
dc.DrawRectangle(Brushes.Green, new Pen(Brushes.Green, 3), new System.Windows.Rect(0, 0, bmpX, bmpY));
dc.DrawLine(new Pen(Brushes.Red, 2.0), new System.Windows.Point(0, 0), new System.Windows.Point(bmpX, bmpY));
dc.DrawLine(new Pen(Brushes.Red, 2.0), new System.Windows.Point(0, bmpY), new System.Windows.Point(bmpX, 0));
dc.Close();
var bmp = new RenderTargetBitmap(bmpX, bmpY, 96, 96, PixelFormats.Pbgra32);
bmp.Render(drawingVisual);
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bmp));
MemoryStream memoryStream = new MemoryStream();
encoder.Save(memoryStream);
HttpResponseMessage httpResponseMessage = new HttpResponseMessage();
httpResponseMessage.Content = new ByteArrayContent(memoryStream.ToArray());
httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png");
httpResponseMessage.StatusCode = HttpStatusCode.OK;
return httpResponseMessage;
}
catch (Exception ex)
{
var message = Request.CreateResponse(HttpStatusCode.Created, ex.ToString());
return message;
}
}
这是我的ASP.Net WebAPI项目中的一个函数,作为Controller的一部分(如果发生了ValuesController,那么将它添加到默认项目应该可以很容易地重现问题)。 如果我将其部署到Azure并在本地运行,然后从Fiddler调用两者,本地工作按预期工作并在绿色背景上返回一个红色X,但Azure返回一个空白图像。
如果我使用GDI(System.Drawing.Bitmap),那么即使从Azure也可以正常工作。不幸的是,这不是解决方案;我正在将已经编写的应用程序从桌面移植到Azure API服务,并且PresentationCore代码非常广泛,转换为GDI需要很长时间。
编辑:如果有人有我可以选择的工作Azure / Web API / PresentationCore应用程序,那可能会非常有帮助。