【发布时间】:2018-06-06 21:53:21
【问题描述】:
过去 3 天,我一直在尝试远程创建和使用 Windows 10 UWP AppService。当 AppService 在一台笔记本电脑上运行而客户端在另一台笔记本电脑上运行(桌面到桌面)时,我得到了这一切。但是,当我在手机上安装客户端时,IBackgroundTaskInstance 会取消,原因是:SystemPolicy。 我不知道为什么在电话到桌面的情况下它不起作用。 有人知道从哪里开始寻找吗?
下面是我的服务类
using Newtonsoft.Json;
using SharedObjects;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Threading.Tasks;
using Windows.ApplicationModel;
using Windows.ApplicationModel.AppService;
using Windows.ApplicationModel.Background;
using Windows.ApplicationModel.Core;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.Management.Deployment;
using Windows.Storage.Streams;
namespace AppStarterService
{
public sealed class AppStarterTask : IBackgroundTask
{
BackgroundTaskDeferral serviceDeferral;
AppServiceConnection connection;
public void Run(IBackgroundTaskInstance taskInstance)
{
try
{
serviceDeferral = taskInstance.GetDeferral();
taskInstance.Canceled += OnTaskCanceled;
var details = taskInstance.TriggerDetails as AppServiceTriggerDetails;
if (details.Name == "com.poctools.appstarter")
{
connection = details.AppServiceConnection;
connection.RequestReceived += OnRequestReceived;
connection.ServiceClosed += Connection_ServiceClosed;
}
else
{
serviceDeferral.Complete();
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
throw;
}
}
async void OnRequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
{
var messageDeferral = args.GetDeferral();
try
{
var input = args.Request.Message;
var packageList = await GetPackageListInfo();
var json = JsonConvert.SerializeObject(packageList, Formatting.None);
var result = new ValueSet();
result.Add("result", json);
Debug.WriteLine(json);
var response = await args.Request.SendResponseAsync(result); //returns Success, even on the phone-to-desktop scenario
Debug.WriteLine($"Send result: {response}");
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
finally
{
messageDeferral.Complete();
}
}
private void Connection_ServiceClosed(AppServiceConnection sender, AppServiceClosedEventArgs args)
{
Debug.WriteLine($"Service closed: {args.Status}");
}
private void OnTaskCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
{
Debug.WriteLine($"Task cancelled: {reason}");
if (serviceDeferral != null)
{
serviceDeferral.Complete();
serviceDeferral = null;
}
if (connection != null)
{
connection.Dispose();
connection = null;
}
}
private async Task<List<PackageInfo>> GetPackageListInfo()
{
try
{
List<PackageInfo> PackageInfoList = new List<PackageInfo>();
PackageManager packageManager = new PackageManager();
var Packages = packageManager.FindPackagesForUser("");
foreach (var package in Packages.Where(p => p.SignatureKind == PackageSignatureKind.Store && !p.IsFramework))
{
IReadOnlyList<AppListEntry> entryList = await package.GetAppListEntriesAsync();
if (entryList != null)
{
foreach (var entry in entryList)
{
if (entry != null)
{
Debug.WriteLine(entry.DisplayInfo.DisplayName);
var name = entry.DisplayInfo.DisplayName;
RandomAccessStreamReference stream = entry.DisplayInfo.GetLogo(new Size(150, 150));
if (stream != null)
{
var streamContent = await stream.OpenReadAsync();
if (streamContent != null)
{
byte[] buffer = new byte[streamContent.Size];
await streamContent.ReadAsync(buffer.AsBuffer(), (uint)streamContent.Size, InputStreamOptions.None);
string logo = Convert.ToBase64String(buffer);
PackageInfoList.Add(new PackageInfo(name, package.Id.FamilyName, logo));
}
}
}
}
}
Debug.WriteLine($"{package.Id.Name} - {package.SignatureKind}");
}
return PackageInfoList;
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
throw;
}
}
}
}
【问题讨论】:
-
你的手机中部署服务商成功了吗?
-
提供程序部署在笔记本电脑上。电话将充当客户端。 SendResponseAsync() 确实返回了一个 AppServiceResponseStatus.Success,但在一秒钟左右后它仍然返回到 OnTaskCanceled() 中。 (它在调试模式下运行)
-
您需要将服务和客户端部署在同一台设备上,并为本地应用提供服务。根据您的要求,您可以为多个设备创建一个网络服务。
-
但它适用于桌面到桌面的场景。即使电话连接到服务,我也可以在主机的输出窗口中看到它(json 被创建得很好)。电话连接到主机,主机完成它,然后执行 SendResponseAsync() 给出“成功”响应。但是电话端什么也没有发生,一两秒后调用 OnTaskCanceled()。我能想到的只是秋季创作者更新功能,但找不到任何文档。已经在考虑 WCF,但看到“通用”不起作用,这令人沮丧。
-
回到绘图板并做了一个只返回一个小字符串的服务。我在github.com/POC-Tools/RemoteAppServiceExample 上发布了一个工作示例。也许有一个可以发送的大小限制,并且 json 很大。需要进行更多测试。
标签: uwp