Xaml 在 IIS 中呈现不工作(但在 IISExpress 中)

Xaml Rendering in IIS not working (but in IISExpress)

对于我的应用程序,我在服务器上呈现一些图表(基于 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 线程中,对于这个问题,图表库无关紧要,它也应该适用于具有背景颜色的简单网格..

如我所说,代码 运行s a) 在(非 wpf)控制台应用程序中 b) 在 IIS Express 中 c) 在迁移到 NET Core 之前在 IIS 中。

我有什么想法可以让这项工作成功吗?

我遇到过类似的问题。 控件可能未完全呈现。并且没有提供任何事件来通知我们渲染完成(因为 Loaded 事件为时过早)。 所以答案是:我猜 IISExpress 比 IIS 慢一点)。

如果我是对的,那么这里有一些可行的解决方法:

  • 渲染前尝试await Task.Delay(1000)
  • 如此讨厌,但有效:打开一个透明 window,并使控件成为此 window 的内容。在渲染事件上关闭它。 (我有一个图表库,它需要现有的可视化树才能正常工作,这是一个可行的解决方法)。您需要让您的控制台应用程序才能使用 WPF。
  • 或者,如果您使用 WPF 创建控制台应用程序,则使用 Dispatcher 调用呈现方法可能就足够了,优先级较低。但是对于没有打开 window 的 WPF 应用程序,您需要先启动 Dispatcher

我终于找到了解决方案,有一个隐藏的兼容性开关可用

https://github.com/microsoft/WPF-Samples/tree/master/Compatibility

Service/Non-interactive Window 站 默认情况下,无论显示设备是否存在,渲染都会继续。除非使用的 WPF API 是短暂的(如渲染到位图),否则它会导致 CPU 峰值。如果服务内的应用程序 运行 想要接收 'default' WPF 行为,即在没有显示设备的情况下不呈现,则应将其设置为 true

简而言之,将一个新文件“runtimeconfig.template.json”添加到您的项目中,内容为

{ "configProperties": { "Switch.System.Windows.Media.ShouldRenderEvenWhenNoDisplayDevicesAreAvailable": true } }