UWP AppServiceConnection没有获得价值

时间:2017-05-17 18:09:10

标签: c# uwp

我正在尝试通过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;
    }
}

我的服务代码:

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();
}

这种方法在某些时候有效,但有时候ValueSetreturnValue)在主机接收时随机为空。它在服务中返回时有Value,但是当我在主机中得到响应时,没有。

我已经确认该服务确实正在设置该值,将其添加到ValueSet并正确返回。

请注意,我的服务正在接收请求,主机正在接收响应,响应状态为Success;连接失败不是问题。

有时这种情况只会在请求再次开始工作之前发生一次,有时会连续发生十次。

失败后的第一个工作响应总是比正常时间长得多。

此外,我在从主机到服务的请求中没有任何问题。它总是服务于托管问题出现的地方。

有没有其他人遇到这个问题并想出来了?

1 个答案:

答案 0 :(得分:4)

在创建示例应用程序的过程中,我意识到问题所在。我在行var messageDeferral = args.GetDeferral();之前执行了一个异步操作(尽管很短)。似乎这允许后台任务在响应主机之前关闭。只需将该行移动到OnRequestReceived函数的开头即可解决问题。

所以对于遇到类似问题的人来说,在你做任何其他事情之前得到你的推迟 :免除我经历的痛苦。