我正在尝试通过AppServiceConnection. 我在我的主机应用程序中使用以下代码:
using (var connection = new AppServiceConnection())
{
connection.AppServiceName = extension.AppServiceName;
connection.PackageFamilyName = extension.PackageFamilyName;
var connectionStatus = await connection.OpenAsync();
if (connectionStatus == AppServiceConnectionStatus.Success)
{
var response = await connection.SendMessageAsync(requestMessage);
if (response.Status == AppServiceResponseStatus.Success)
returnValue = response.Message as ValueSet;
}
}
Run Code Online (Sandbox Code Playgroud)
还有我的服务代码:
private async void OnRequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
{
var messageDeferral = args.GetDeferral();
var message = args.Request.Message;
var returnData = new ValueSet();
var command = message["Command"] as string;
switch (command)
{
case "ACTION":
var value = await AsyncAction();
returnData = new ValueSet { { "Value", JsonConvert.SerializeObject(value) } };
break;
default:
break;
}
await args.Request.SendResponseAsync(returnData);
messageDeferral.Complete();
}
Run Code Online (Sandbox Code Playgroud)
这在某些时候有效,但其他时候ValueSet( returnValue) 在主机接收时随机为空。它Value在服务中返回时包含在其中,但是当我在主机中收到响应时,什么也没有。
我已经验证该服务确实在设置值,将其添加到ValueSet并正确返回。
请注意,我的服务正在接收请求,主机正在接收响应,响应状态为Success; 连接失败不是问题。
有时这只会在请求再次开始工作之前发生一次,其他时候它会连续发生十次。
故障后的第一个工作响应总是比正常情况花费更长的时间。
此外,我在从主机到服务的请求中没有任何问题。它始终为出现问题的主机服务。
有没有其他人遇到过这个问题并弄清楚了?
在创建示例应用程序的过程中,我意识到了问题所在。我在我的线路之前执行了一个异步操作(虽然很短)var messageDeferral = args.GetDeferral();。这似乎允许后台任务在响应主机之前关闭。只需将该行移动到OnRequestReceived函数的开头即可为我解决问题。
因此,对于遇到类似问题的任何人,请在做任何其他事情之前获得延期!省去我经历的痛苦吧。