对于我的应用程序,我正在服务器上渲染一些图表(基于WPF),并将它们发送回客户端。我最近将应用程序迁移到了NET Core,这似乎工作得很好,直到最后我在IIS上部署的时候。在那里,图表是空的。然而,当在IISExpress中托管该应用程序时,一切都顺利进行。
我现在想知道IIS和IISexpress在图形方面有什么不同。
我正在执行的代码。
RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap((int)control.Width, (int)control.Height, 96, 96, PixelFormats.Pbgra32);
renderTargetBitmap.Clear();
renderTargetBitmap.Render((Visual)control);
var encoder = new PngBitmapEncoder();
var bitmapFrame = BitmapFrame.Create(renderTargetBitmap);
encoder.Frames.Add(bitmapFrame);
encoder.Save(memoryStream);
代码是在STA线程中运行的 为了解决这个问题 图表库并不重要 它也应该适用于一个简单的带背景色的网格... ...
正如我所说,代码运行在a)在(非wpf)控制台应用程序中b)在IIS Express中c)在迁移到NET Core之前的IIS中。
有什么办法可以让我的程序正常运行吗?
我有类似的问题.有可能是一个控件没有完全渲染。而且没有提供任何事件来通知我们渲染完成(因为Loaded事件太早了).所以答案是:我猜IISExpress比IIS慢一点)。
如果我是对的,那么这里有一些变通的办法,可能会有用。
await Task.Delay(1000)
渲染前。Dispatcher
,在低优先级上。但对于一个没有打开窗口的WPF应用程序,你需要启动 Dispatcher
首先。我终于找到了解决方法,有一个隐藏得很好的兼容性开关可供使用
https:/github.commicrosoftWPF-SamplestreemasterCompatibility。
ServiceNon-interactive Window StationsRendering将在默认情况下继续进行,而不管显示设备是否存在。除非正在使用的WPF API是短暂的(比如渲染到位图),否则会导致CPU峰值。如果在服务内部运行的应用程序希望接收 "默认 "WPF行为,即在没有显示设备的情况下不进行渲染,那么应该将其设置为true。
简而言之,在您的项目中添加一个新文件 "runtimeconfig.template.json",内容为
{ "configProperties":"Switch.System.Windows.Media.ShouldRenderEvenWhenNoDisplayDevicesAreAvailable":true } }