在IIS中的Xaml渲染不能工作(但在IISExpress中却能正常工作

问题描述 投票:0回答:1

对于我的应用程序,我正在服务器上渲染一些图表(基于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中。

有什么办法可以让我的程序正常运行吗?

c# wpf iis iis-express
1个回答
0
投票

我有类似的问题.有可能是一个控件没有完全渲染。而且没有提供任何事件来通知我们渲染完成(因为Loaded事件太早了).所以答案是:我猜IISExpress比IIS慢一点)。

如果我是对的,那么这里有一些变通的办法,可能会有用。

  • 试试 await Task.Delay(1000) 渲染前。
  • 很讨厌,但很有效:打开一个透明的窗口,并让控件成为这个窗口的内容。在渲染事件时关闭它。(我有一个图表库,需要视觉树存在,才能正常工作,这是一个可行的变通方法)。你需要让你的控制台应用程序使用WPF。
  • 或者,如果你使用WPF来制作你的控制台应用程序,可能只需要在调用你的渲染方法时使用 Dispatcher,在低优先级上。但对于一个没有打开窗口的WPF应用程序,你需要启动 Dispatcher 首先。

0
投票

我终于找到了解决方法,有一个隐藏得很好的兼容性开关可供使用

https:/github.commicrosoftWPF-SamplestreemasterCompatibility。

ServiceNon-interactive Window StationsRendering将在默认情况下继续进行,而不管显示设备是否存在。除非正在使用的WPF API是短暂的(比如渲染到位图),否则会导致CPU峰值。如果在服务内部运行的应用程序希望接收 "默认 "WPF行为,即在没有显示设备的情况下不进行渲染,那么应该将其设置为true。

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

{  "configProperties":"Switch.System.Windows.Media.ShouldRenderEvenWhenNoDisplayDevicesAreAvailable":true } }
© www.soinside.com 2019 - 2024. All rights reserved.