我正在尝试通过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();
}
这种方法在某些时候有效,但有时候ValueSet
(returnValue
)在主机接收时随机为空。它在服务中返回时有Value
,但是当我在主机中得到响应时,没有。
我已经确认该服务确实正在设置该值,将其添加到ValueSet
并正确返回。
请注意,我的服务正在接收请求,主机正在接收响应,响应状态为Success
;连接失败不是问题。
有时这种情况只会在请求再次开始工作之前发生一次,有时会连续发生十次。
失败后的第一个工作响应总是比正常时间长得多。
此外,我在从主机到服务的请求中没有任何问题。它总是服务于托管问题出现的地方。
有没有其他人遇到这个问题并想出来了?
答案 0 :(得分:4)
在创建示例应用程序的过程中,我意识到问题所在。我在行var messageDeferral = args.GetDeferral();
之前执行了一个异步操作(尽管很短)。似乎这允许后台任务在响应主机之前关闭。只需将该行移动到OnRequestReceived
函数的开头即可解决问题。
所以对于遇到类似问题的人来说,在你做任何其他事情之前得到你的推迟 :免除我经历的痛苦。