边缘扩展:当DesktopBridge应用程序尝试打开WebSocket时,BackgroundTaskInstance因系统策略原因取消

边缘扩展:当DesktopBridge应用程序尝试打开WebSocket时,BackgroundTaskInstance因系统策略原因取消,websocket,uwp,desktop-bridge,microsoft-edge-extension,Websocket,Uwp,Desktop Bridge,Microsoft Edge Extension,我创建了一个边缘浏览器扩展,它使用本机消息传递到通过桌面网桥技术运行的本机应用程序。我使用了作为示例,其中包含边缘扩展、UWP主机和Win32桌面网桥应用程序 我需要Win32 Desktop Bridge应用程序使用HTTP和WebSocket连接到web服务,因此我在包清单中添加了一个internetClientServer和一个privateNetworkClientServer功能,旁边是已经存在的runFullTrust功能 Win32桌面网桥应用程序可以正常激活,并且可以使用HTTP

我创建了一个边缘浏览器扩展,它使用本机消息传递到通过桌面网桥技术运行的本机应用程序。我使用了作为示例,其中包含边缘扩展、UWP主机和Win32桌面网桥应用程序

我需要Win32 Desktop Bridge应用程序使用HTTP和WebSocket连接到web服务,因此我在包清单中添加了一个
internetClientServer
和一个
privateNetworkClientServer
功能,旁边是已经存在的
runFullTrust
功能

Win32桌面网桥应用程序可以正常激活,并且可以使用HTTP连接到web服务器。但是,一旦尝试打开WebSocket连接,UWP主机上的
BackgroundTaskInstance
就会收到一个取消请求,原因是
BackgroundTaskCancellationReason.SystemPolicy
,桌面网桥应用程序关闭。不幸的是,
BackgroundTaskCancellationReason.SystemPolicy
的文档没有对取消请求的真正原因进行太多解释

我尝试使用两个WebSocket类:
System.Net.WebSocket.ClientWebSocket
Windows.Networking.Sockets.MessageWebSocket
,结果相同。没有花哨的代码,只是普通的

var socket = new MessageWebSocket();
...
await socket.ConnectAsync(new Uri("wss://127.0.0.1:9001/myservice"));
其他WS-Client也提供相同的WebSocket服务端点,因此我猜这里没有服务器/防火墙/防病毒问题

我还使用了
CheckNetIsolation
工具,为边缘浏览器和包添加了环回豁免,但没有效果。HTTP在没有环回豁免的情况下运行良好


什么可能是任务取消的真正原因,什么可能是防止任务取消的方法?

好的,我解决了这个问题。由于我偶然发现了by,我意识到
BackgroundTaskCancellationReason.SystemPolicy
告诉我后台任务被系统关闭以释放一些系统资源,在我的例子中,这是因为我没有在异步事件处理程序中获得延迟。当事件处理程序在没有延迟的情况下让步时,系统决定可以关闭任务。以下是代码的摘要版本:

静态类程序
{
静态AppServiceConnection=null;
[状态线程]
静态void Main(字符串[]参数)
{
线程appServiceThread=新线程(新线程开始(ThreadProc));
appServiceThread.Start();
Application.Run();
}
静态异步void ThreadProc()
{
试一试{
连接=新的AppServiceConnection();
connection.AppServiceName=“…”;
connection.PackageFamilyName=Windows.ApplicationModel.Package.Current.Id.FamilyName;
connection.RequestReceived+=OnRequestReceived;
connection.ServiceClosed+=OnServiceClosed;
var status=await connection.OpenAsync();
....
}
捕获(例外e){…}
}
接收到请求时私有静态异步无效(AppServiceConnection发送方,AppServiceRequestReceivedEventArgs args)
{

var defer=args.GetDeferral()/好的,我解决了这个问题。由于我偶然发现了by,我意识到
BackgroundTaskCancellationReason.SystemPolicy
告诉我后台任务被系统关闭以释放一些系统资源,在我的例子中,这是因为我没有在异步事件处理程序中获得延迟。当事件发生时在没有延迟的情况下,系统决定可以关闭任务。下面是代码的摘要版本:

静态类程序
{
静态AppServiceConnection=null;
[状态线程]
静态void Main(字符串[]参数)
{
线程appServiceThread=新线程(新线程开始(ThreadProc));
appServiceThread.Start();
Application.Run();
}
静态异步void ThreadProc()
{
试一试{
连接=新的AppServiceConnection();
connection.AppServiceName=“…”;
connection.PackageFamilyName=Windows.ApplicationModel.Package.Current.Id.FamilyName;
connection.RequestReceived+=OnRequestReceived;
connection.ServiceClosed+=OnServiceClosed;
var status=await connection.OpenAsync();
....
}
捕获(例外e){…}
}
接收到请求时私有静态异步无效(AppServiceConnection发送方,AppServiceRequestReceivedEventArgs args)
{

var defer=args.GetDeferral();//这是特定于边缘扩展的,还是在常规后台任务中也会失败?您能否澄清:您是从Win32组件还是从后台任务组件进行WebSocket调用?Stefan,我没有在边缘之外尝试。WebSocket调用是从Win32 app进行的,但问题实际上与WebSocket无关请看我的答案。有道理。我以前见过这个:-)这是特定于边缘扩展的,还是在常规后台任务中也会失败?您能否澄清一下:您是从Win32组件还是后台任务组件进行WebSocket调用?Stefan,我没有在边缘之外进行尝试。WebSocket调用是从Win3进行的2个应用程序,但这个问题实际上与WebSocket没有任何关系,请看我的答案。这是有道理的。我以前见过这个:-)