You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 14:45:04