UWP调用AppService SendRequestAsync与C++后端通信无响应问题
问题根因与解决方案
1. 未正确处理UWP侧的RequestReceived事件
你当前C#代码中的OnAppServiceRequestReceived是空实现,AppService连接的事件调度队列要求所有收到的请求(包括系统层面的控制请求、对端主动发送的消息)都必须调用GetDeferral()并在处理完成后调用Complete(),否则会导致整个连接的消息调度卡住,即使是对端返回的响应也无法回传给等待的SendRequestAsync调用。
修复代码:
private async void OnAppServiceRequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args) { var deferral = args.GetDeferral(); try { // 此处可添加自定义消息处理逻辑,比如触发你预定义的MessageReceivedEvent if (MessageReceivedEvent != null) { if (args.Request.Message.TryGetValue("content", out var content)) { MessageReceivedEvent.Invoke(this, content.ToString()); } } } finally { deferral.Complete(); } }
2. 异步上下文死锁
UWP的UI线程有专用的同步上下文,如果await调用没有显式关闭上下文捕获,上层代码如果存在同步等待(比如调用.Result/.Wait())就会触发死锁。
修复SendRequestAsync方法,添加ConfigureAwait(false)避免上下文捕获:
public async Task<AppServiceResponse> SendRequestAsync(Windows.Foundation.Collections.ValueSet message) { return await AppServiceConnection.SendMessageAsync(message).ConfigureAwait(false); }
同时确保上层调用全链路使用await,不要使用任何同步等待方法。
3. 响应消息大小超出限制
AppService的ValueSet单条消息最大支持2MB大小,如果你的HTTP返回的body超过这个阈值,会导致SendResponseAsync执行失败但不会抛出异常,仅会返回错误状态码。
你可以在C++代码的SendResponseAsync调用后添加日志确认返回状态:
auto r = co_await args.Request().SendResponseAsync(result); LOG(AixLog::Severity::info) << "Response send status: " << (int)r << std::endl; if (r != AppServiceResponseStatus::Success) { LOG(AixLog::Severity::info) << "Response send failed, status=" << (int)r << std::endl; }
如果状态为MessageSizeTooLarge,你需要将大响应拆分多批次发送,或者改用共享文件等其他方式传递大数据。
内容的提问来源于stack exchange,提问作者Bitflipper11
相关产品推荐
相关产品推荐

